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:
- strona obciążenia, js sporządzi i Upgrade żądanie jest wysyłane do serwera
- 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);
}
Proszę nie używać readyState jako wskazania do sprawdzania stanu połączenia WebSocket. Używaj tylko 'onopen'. – moka