2013-03-21 97 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