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 断开问题解决方案

TCP和服务器断开连接后重连怎么处理

TCP三次握手连接与四次握手断开

通过 websockets 的 Socket.io - 随机“传输端”断开连接

Javascript Websockets在页面卸载时断开连接

WebSockets:任何有效的 C# 示例?