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:

  1. Laden der Seite, js ausführt und Upgrade-Anfrage an den server gesendet wird
  2. 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.
Schreibe einen Kommentar