我想在网站上使用websockets,所以首先我开发了一个小而简单的websocket页面来测试它。Chrome websockets,readystate始终在0
我有一个在我的本地主机上运行的websocket服务器,它基于python Tornado“聊天”演示。出于某种原因,聊天演示应用程序运行完美,但我似乎无法使用websocket与我自己的页面,虽然某种形式的连接。
我正在使用最新的Chromium版本进行测试,因此实现了受Tornado实现支持的websockets版本13。
所以这里的问题是:
- 加载页面,JS执行和升级请求被发送到
- 服务器收到请求,并在我的理解让Chrome所以在这里回答
服务器设置readyState = 1,我应该能够从我的页面发送消息。
只是因为某些原因,它不起作用,readyState保持为0,当然如果我尝试发送消息,我收到一个INVALID_STATE_ERR。
这里是头部:
请求:
GET ws://127.0.0.1:8000/chatsocket HTTP/1.1
Origin: http://127.0.0.1
Cookie: _xsrf=9f73731fc2d544df864ce777bef0775a
Connection: Upgrade
Host: 127.0.0.1:8000
Sec-WebSocket-Key: pkwlpY+TtxfgUrm3M4WtTQ==
Upgrade: websocket
Sec-WebSocket-Version: 13
响应:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: ur9KL2jBhYB38e2SgwOkjyBlQXk=
任何帮助表示赞赏:)
---编辑---
所以我想通了最后,如果你碰上这里同样的问题的原因是:
的WebSocket的readyState的更新时,线程结束!
所以运行的代码,如:
var ws = new WebSocket(stuff);
while(ws.readyState==0){};
将发送浏览器在一个无限循环......
喜欢跑步代码:
var ws=new WebSocket(stuff);
do_other_stuf();
可能会奏效,但你不会能够使用WS。
如果是应该打开了套接字之后运行的代码使用,它就会有办法写入套接字:
var ws=new WebSocket(stuff);
ws.onopen = new function(){
// some code that need WS to be open
}
// rest of the code that doesn't require WS to be open
一个更好的方式来做到这将是通过使用异步调用让螺纹端:
var ws = new WebSocket(stuff);
setTimeout(whatever,500);
function whatever(){
if(ws.readyState==1){
// The code you want to run after WS is open
}
else
setTimeout(whatever,500);
}
请不要使用readyState作为检查WebSocket连接状态的指示。只使用'onopen'。 – moka 2014-01-14 18:03:25