【问题标题】:Cannot get websocket connection to work in Chrome 19无法让 websocket 连接在 Chrome 19 中工作
【发布时间】:2012-05-14 11:06:48
【问题描述】:

我有一个与 Firefox 和 Chrome 18 完美配合的 websocket 客户端/服务器。它不适用于 Chrome 19 beta。我怀疑这是由于这个浏览器现在使用了我的服务器不支持的 deflate-frame 扩展。

Chrome 19 测试版在握手时发送了这个: "Sec-WebSocket-Extensions: x-webkit-deflate-frame"

我的服务器发回: "Sec-WebSocket-Extensions:"

但这不是拒绝扩展的正确方法,或者还有其他我没有发现的错误。这是握手中唯一与我从工作浏览器中看到的不同的东西。

编辑:这里有一些附加信息。这些是 Wireshark 捕获的握手。


使用 Firefox 12 的握手:

GET /chatserver HTTP/1.1
主持人:(本帖省略)
用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
接受语言:en-us,en;q=0.5
接受编码:gzip、deflate
DNT:1
连接:保持活动,升级
Sec-WebSocket-版本:13
出处:(本帖省略)
Sec-WebSocket-Key:2TKm4ozUQdNP17Lobt7IBg==
编译指示:无缓存
缓存控制:无缓存
升级:websocket

HTTP/1.1 101 切换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept: pSUB3BT9YUUd9n3mOeWY/1uVqJE=


使用 Chrome 18 的握手:

GET /chatserver HTTP/1.1
升级:websocket
连接:升级
主持人:(本帖省略)
出处:(本帖省略)
Sec-WebSocket-Key:zuHLEC8pGvAMadarhCLXFA==
Sec-WebSocket-版本:13

HTTP/1.1 101 切换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept: LMBSq6Bk9Kiv+zAbQlAL899pfzc=


使用 Chrome 19 的握手:

GET /chatserver HTTP/1.1
升级:websocket
连接:升级
主持人:(本帖省略)
出处:(本帖省略)
Sec-WebSocket-Key:TbwnVcuUiqGgZn7hxvxzvQ==
Sec-WebSocket-版本:13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

HTTP/1.1 101 交换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept: D45BJ+Vfydy1Upcs3Hze/nuiaS8=
Sec-WebSocket-Extensions:


所有服务器响应都有 \r\n 行结尾,并在消息末尾包含一个额外的 \r\n。

FF12 和 Chrome18 工作 -- Chrome19 不工作。在 Chrome19 中,服务器握手响应之后的下一个数据包是 FIN/ACK。连接已关闭。

注意。我也尝试使用连字符作为 Sec-WebSocket-Extensions 值,但这也不起作用。

【问题讨论】:

    标签: google-chrome-extension websocket phpwebsocket


    【解决方案1】:

    找到问题了。

    首先,服务器响应中的空白 Sec-WebSocket-Extensions 条目产生了“Invalid UTF-8 sequence in header value”错误。删除该条目后,剩余的错误是“A server must not mask any frames that it sends to the client.

    确实,我的服务器实现(PHPWebSocket 的高度修改版本)默认屏蔽它发送的帧。更改此默认行为解决了问题,并且 websocket 连接现在可以在 Chrome 19 中使用。

    将 PHPWebSocket 标记添加到此问题,因为这是该项目的问题。

    【讨论】:

    • 嗨亚伦,请你指出我在哪里改变什么?我有完全相同的问题,我使用的是相同的 PHP-Websocket,但它突然停止在最新版本的 Chrome 上工作。
    • @ClintonGreen:在 Connection.php 中查找发送函数。您将在参数中看到 $masked 默认为 true。该参数必须为 false,发送才能在 Chrome 19+ 中正常工作。抱歉回复晚了。
    【解决方案2】:

    对于 Chrome,“Sec-WebSocket-Protocol”标头必须对服务器端和客户端都具有价值。 我就是这种情况。

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2014-04-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多