我正在尝试在网站上使用 websockets,所以首先我开发了一个小而非常简单的 websocket 页面来测试它。
我的本地主机上运行了一个 websocket 服务器,它基于 python Tornado "Chat" 演示。出于某种原因,聊天演示应用程序运行完美,但我似乎无法将 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 在 Thread ENDS 时更新!
所以运行如下代码:
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);
}