WebSockets 握手后 Chrome 断开连接
Posted
技术标签:
【中文标题】WebSockets 握手后 Chrome 断开连接【英文标题】:Chrome disconnects after WebSockets handshake 【发布时间】:2011-07-23 11:59:25 【问题描述】:我正在尝试让一个简单的 WebSocket 示例在我的机器 (localhost
) 上运行,我让 javascript 和 C# 运行良好并连接,除了 Chrome 在握手后断开连接。
我已经搜索了一上午,我认为这与相同的域策略有关,正如另一个“问题”所暗示的那样,我已将浏览器更新到最新版本 (12.xxx
)。
但是我找不到解决问题的方法。
我在 C# 端使用:
ConnectionOrigin = "http://localhost:8080";
ServerLocation = "ws://localhost:8181/test";
我正在使用直接从磁盘打开的普通 html 文件运行 JavaScript(网址栏上的file:///
)。我也尝试过使用 XAMPP 在本地托管它,但我总是遇到同样的问题。
附上C#程序的日志输出:
New connection from 127.0.0.1:8181 requested. Handshaking ...
Reading handshake ...
GET /test HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8181
Origin: null
Sec-WebSocket-Key1: R 506 I 2D 6 qFB G0`@88J? 4
Sec-WebSocket-Key2: y 20 8403!24 L 5 8
Sending handshake ...
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://localhost:8080
WebSocket-Location: ws://localhost:8181/test
New connection from 127.0.0.1:8181 established.
http://localhost:8080
Data sent to the client ["Time at the server: 23-07-2011 12:57:27"]
Client disconnected.
Waiting for another connection attempt ...
【问题讨论】:
您使用的是什么 WebSocket 服务器?您从 Chrome(在 Chrome javascript 控制台中)得到什么错误?此外,您显示的握手值适用于协议的 Hixie-76 版本,但它们不完整,如图所示。客户端应在握手结束时发送 8 个随机字节。服务器应该发回 16 个字节,这些字节基于 key1、key2 和来自客户端的 8 个随机字节。 【参考方案1】:如果有此请求:
GET /test HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8181
Origin: null
Sec-WebSocket-Key1: R 506 I 2D 6 qFB G0`@88J? 4
Sec-WebSocket-Key2: y 20 8403!24 L 5 8
回复必须是:
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://localhost:8181/test
the response code here
所以:
第一行是WebSocket
,而不是Web Socket
。
这是Sec-WebSocket-...
而不是WebSocket-...
。
您没有包含作为握手的基本部分的响应代码(其结构在the specs 中进行了描述)。
另外,您应该使用 \r\n
而不是 \n
(如果您还没有使用的话)。
附带说明一下,您可能需要咨询chrome://net-internals/
(Events
标签,然后查找适当的SOCKET_STREAM
)以查看 Chrome 实际收到的响应。
【讨论】:
【参考方案2】:也许你必须设置Connection: keep-alive
:http://en.wikipedia.org/wiki/HTTP_persistent_connection
【讨论】:
替换:握手 += "连接:升级" + Environment.NewLine;与:握手+ =“连接:保持活动”+ Environment.NewLine;没有给我任何结果。以上是关于WebSockets 握手后 Chrome 断开连接的主要内容,如果未能解决你的问题,请参考以下文章
通过 websockets 的 Socket.io - 随机“传输端”断开连接