Chrome websockets, readystate immer auf 0
Ich versuche, websockets auf eine website, so dass ich zunächst entwickelt sich eine kleine und sehr einfache websocket-Seite, nur um es zu testen.
Ich habe einen websocket-server läuft auf meinem localhost, es basiert auf dem python-Tornado "Chat" - demo. Für einige Grund die chat-demo-app läuft perfekt, aber ich kann nicht scheinen, um die Verwendung der websocket-mit meiner eigenen Seite, obwohl irgendeine form von Verbindung.
Ich Teste das mit der neuesten Chromium version, also die Umsetzung websockets version 13, die unterstützt wird durch die Tornado-Implementierung.
So, hier ist das problem:
- Laden der Seite, js ausführt und Upgrade-Anfrage an den server gesendet wird
- Server empfängt die Anfrage und Antworten
Also hier in meinem Verständnis Chrome sollte readyState = 1, und ich sollte in der Lage sein, Nachrichten zu senden, von meiner Seite.
Nur aus irgendeinem Grund funktioniert es nicht, readyState bleibt 0 und natürlich, wenn ich versuche eine Nachricht zu senden, erhalte ich eine INVALID_STATE_ERR.
Hier sind die Überschriften :
Anfrage:
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
Antwort:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: ur9KL2jBhYB38e2SgwOkjyBlQXk=
Jede Hilfe ist willkommen 🙂
--- EDIT ---
Also dachte ich, dass es am Ende heraus, wenn Sie laufen in das gleiche problem, hier ist der Grund:
WebSocket-s readyState aktualisiert wird, wenn der Thread ENDET !
So läuft ein code wie:
var ws = new WebSocket(stuff);
while(ws.readyState==0){};
Sendet der browser in eine Endlosschleife...
Ausführen von code wie:
var ws=new WebSocket(stuff);
do_other_stuf();
Funktionieren könnte, aber Sie werden nicht in der Lage zu verwenden WS.
Wenn der code soll ausgeführt werden, nachdem Sie den socket geöffnet, verwendet die socket-dies ist der Weg, es muss geschrieben werden:
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
Einen besseren Weg, dies zu tun wäre, damit der Faden-Ende durch die Verwendung eines asynchronen Aufruf:
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);
}
- Bitte, verwenden Sie nicht readyState als Indiz für die überprüfung WebSocket-Verbindung Stand. Verwenden Sie nur
onopen
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um trigger einige Funktionen, wenn WebSockets verbunden sind, nutzen Sie bitte Rückrufe:
Mit
readyState
ist auch schlecht, was zu tun in einem solchen Fall, vor allem, wenn Sie haben zu Fragen, es mehrere Male (nur unnötig).Zusätzlich berücksichtigt, dass jeder Hersteller von Browsern implementiert WebSockets mit sehr geringfügige Unterschiede (leider), so stellen Sie sicher, testen Sie es in den meisten Browsern.