2013-03-21 14 views
7

Próbuję użyć websockets na stronie internetowej, więc najpierw opracowałem małą i bardzo prostą stronę websocket tylko po to, żeby ją przetestować.Websockets z Chrome, readystate zawsze na 0

Mam serwer websocket uruchomiony na moim localhost, jest on oparty na demo "Chat" pytona Tornado. Z jakiegoś powodu aplikacja do czatowania demo działa idealnie, ale nie wydaje mi się, żebym używał websocket na mojej własnej stronie, chociaż jest jakaś forma połączenia.

Testuję to przy użyciu najnowszej wersji Chromium, więc implementuję websockets w wersji 13, która jest obsługiwana przez implementację Tornado.

Więc tu jest problem:

  1. strona obciążenia, js sporządzi i Upgrade żądanie jest wysyłane do serwera
  2. serwer odbiera żądanie i odpowiada na

Więc w moim rozumieniu Chrome powinny ustaw readyState = 1 i powinienem móc wysyłać wiadomości z mojej strony.

Tylko z jakiegoś powodu to nie działa, readyState pozostaje 0 i oczywiście, jeśli spróbuję wysłać wiadomość, otrzymam INVALID_STATE_ERR.

Oto nagłówki:

Zapytanie:

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 

Response:

HTTP/1.1 101 Switching Protocols 
Connection: Upgrade 
Upgrade: websocket 
Sec-WebSocket-Accept: ur9KL2jBhYB38e2SgwOkjyBlQXk= 

Każda pomoc jest mile widziana :)



--- EDIT ---


Więc zorientowaliśmy się w końcu, jeśli napotkasz ten sam problem tutaj jest powód:

websocket za readyState jest aktualizowany, gdy Wątek ENDS!

Więc jak działa kod:

var ws = new WebSocket(stuff); 
while(ws.readyState==0){}; 

wyśle ​​przeglądarkę w nieskończonej pętli ...

Uruchamianie kodu takich jak:

var ws=new WebSocket(stuff); 
do_other_stuf(); 

może działać, ale przyzwyczajenie być w stanie używać WS.


Jeśli kod, który ma działać po otwarciu gniazda wykorzystuje gniazdo to jest droga będzie musiała być napisane:

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 

lepszy sposób zrobić to byłoby niech koniec nici za pomocą asynchronicznego połączenia:

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

Proszę nie używać readyState jako wskazania do sprawdzania stanu połączenia WebSocket. Używaj tylko 'onopen'. – moka

Odpowiedz

3

w celu uruchomienia niektórych funkcji, gdy są podłączone WebSockets proszę użyć wywołania zwrotne:

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 
}; 

Korzystanie readyState jest dobrze źle zrobić w takim wypadku, szczególnie jeśli trzeba zadać mu kilka razy (to tylko niepotrzebny).

Dodatkowo należy wziąć pod uwagę, że każdy sprzedawca przeglądarek implementuje WebSockets z niewielkimi różnicami (niestety), dlatego należy go przetestować w większości przeglądarek.

+1

+1 Wyczyść odpowiedź, a ja jej użyję. – javadba

Powiązane problemy