我试图得到一个简单的WebSocket的例子在我的机器上工作(localhost
),我得到JavaScript和c#运行得很好,除了Chrome在握手后断开连接。
我整个早上都在搜索,我认为这与相同的域策略有关,正如另一个"问题"所建议的那样,我已经将浏览器更新到最新版本(12.xxx
)。
但是我找不到解决问题的方法。
我在c#端使用:
ConnectionOrigin = "http://localhost:8080";
ServerLocation = "ws://localhost:8181/test";
和我运行JavaScript使用一个正常的HTML文件直接从磁盘打开(file:///
在url栏上)。我也尝试过使用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-...
。 - 你没有包括响应代码,这是握手的基本部分(其结构在规范中有描述)。
- 另外,你应该使用
rn
而不是n
(如果你还没有)。
另一方面,您可能要咨询chrome://net-internals/
(Events
选项卡,然后寻找适当的SOCKET_STREAM
),以查看Chrome实际收到的响应。
也许你必须设置Connection: keep-alive
: http://en.wikipedia.org/wiki/HTTP_persistent_connection