我正在尝试让一个简单的 WebSocket 示例在我的机器 (localhost
) 上运行,我让 JavaScript 和 C# 运行良好并连接,除了 Chrome 在握手后断开连接。
我搜索了一上午,我认为它与同一个域策略有关,正如另一个“问题”所暗示的,我已经将我的浏览器更新到最新版本(12.xxx
) .
但是我找不到解决问题的方法。
我在 C# 端使用:
ConnectionOrigin = "http://localhost:8080";
ServerLocation = "ws://localhost:8181/test";
我正在使用直接从磁盘打开的普通 HTML 文件(网址栏上的 file:///
)运行 JavaScript。我也尝试过使用 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 ...
最佳答案
对于这种请求:
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 实际收到的响应。
关于c# - WebSockets 握手后 Chrome 断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6800190/