2013-03-21 2260 views
7

我想在网站上使用websockets,所以首先我开发了一个小而简单的websocket页面来测试它。Chrome websockets,readystate始终在0

我有一个在我的本地主机上运行的websocket服务器,它基于python Tornado“聊天”演示。出于某种原因,聊天演示应用程序运行完美,但我似乎无法使用websocket与我自己的页面,虽然某种形式的连接。

我正在使用最新的Chromium版本进行测试,因此实现了受Tornado实现支持的websockets版本13。

所以这里的问题是:

  1. 加载页面,JS执行和升级请求被发送到
  2. 服务器收到请求,并在我的理解让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); 
} 
+0

请不要使用readyState作为检查WebSocket连接状态的指示。只使用'onopen'。 – moka 2014-01-14 18:03:25

回答

3

为了触发某些功能时的WebSockets连接请使用回调:

var socket = new WebSocket(...); 

socket.onopen = function() { 
    // socket is connected 
}; 
socket.onerror = function() { 
    // some error happened 
}; 
socket.onmessage = function(evt) { 
    // you get a message: evt.data 
}; 

使用readyState是非常糟糕的事情在这种情况下做的,特别是如果你有多次问它(仅仅是不必要的)。

另外要考虑到,每个浏览器供应商都实现了WebSockets,但差别很小(不幸),所以请确保您在大多数浏览器中测试它。

+1

+1清楚的答案,我会用它。 – javadba 2014-06-04 15:18:01