我想在網站上使用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