wake-up-neo.com

WebSocket richtig schließen (HTML5, Javascript)

Ich spiele mit HTML5 WebSockets herum. Ich habe mich gefragt, wie ich die Verbindung ordnungsgemäß schließe. Was passiert, wenn der Benutzer die Seite aktualisiert oder nur den Browser schließt?

Es gibt ein seltsames Verhalten, wenn ein Benutzer die Seite nur aktualisiert, ohne websocket.close() aufzurufen - wenn er nach der Aktualisierung zurückkehrt, wird websocket.onclose Veranstaltung.

117
Andy Hin

Entsprechend der Protokollspezifikation v76 (welche Version der Browser mit aktuellem Support implementiert):

Um die Verbindung sauber zu schließen, wird von einem Peer ein Frame gesendet, der nur aus einem 0xFF-Byte gefolgt von einem 0x00-Byte besteht, um den anderen Peer aufzufordern, die Verbindung zu schließen.

Wenn Sie einen Server schreiben, sollten Sie sicherstellen, dass ein Close Frame gesendet wird, wenn der Server eine Client-Verbindung schließt. Die normale Methode zum Schließen des TCP Sockets kann manchmal langsam sein und bei Anwendungen zu der Annahme führen, dass die Verbindung auch dann noch offen ist, wenn dies nicht der Fall ist.

Der Browser sollte dies wirklich für Sie tun, wenn Sie die Seite schließen oder neu laden. Sie können jedoch sicherstellen, dass ein enger Frame gesendet wird, indem Sie das Ereignis beforeunload erfassen:

window.onbeforeunload = function() {
    websocket.onclose = function () {}; // disable onclose handler first
    websocket.close();
};

Ich bin nicht sicher, wie Sie ein Onclose-Ereignis abrufen können, nachdem die Seite aktualisiert wurde. Das Websocket-Objekt (mit dem Onclose-Handler) ist nach dem erneuten Laden der Seite nicht mehr vorhanden. Wenn Sie sofort versuchen, eine WebSocket-Verbindung auf Ihrer Seite herzustellen, während die Seite geladen wird, tritt möglicherweise ein Problem auf, bei dem der Server eine neue Verbindung so schnell ablehnt, nachdem die alte Verbindung getrennt wurde (oder der Browser nicht bereit ist Wenn Sie an dem Punkt, an dem Sie eine Verbindung herstellen möchten, Verbindungen herstellen möchten, wird ein Ereignis onclose für das neue Websocket-Objekt angezeigt.

96
kanaka

Ganz einfach, du schließt es :)

var myWebSocket = new WebSocket("ws://example.org"); 
myWebSocket.send("Hello Web Sockets!"); 
myWebSocket.close();

Haben Sie auch die folgende Seite und die Einführungsartikel von Opera

35
karlcow

Das Problem ist, dass derzeit zwei Hauptprotokollversionen von WebSockets verwendet werden. Die alte Version, die das [0x00][message][0xFF] - Protokoll verwendet, und die neue Version, die Hybi-formatierte Pakete verwendet.

Die alte Protokollversion wird von Opera und iPod/iPad/iPhones verwendet, daher ist es eigentlich wichtig, dass auf WebSockets-Servern Abwärtskompatibilität implementiert ist. Bei diesen Browsern, die das alte Protokoll verwenden, wurde festgestellt, dass die Seite aktualisiert wurde Wenn Sie sich von der Seite entfernen oder den Browser schließen, wird die Verbindung automatisch geschlossen.

Bei Browsern mit der neuen Protokollversion (z. B. Firefox, Chrome und eventuell IE10)) führt das Schließen des Browsers jedoch dazu, dass der Browser die Verbindung automatisch schließt. Das heißt, wenn Sie eine Aktualisierung durchführen Wenn Sie die Seite verlassen oder von der Seite weg navigieren, wird die Verbindung vom Browser NICHT automatisch getrennt. Der Browser sendet jedoch ein Hybi-Paket an den Server, wobei das erste Byte (die Proto-ID) 0x88 (besser bekannt als Close Data Frame): Sobald der Server dieses Paket erhalten hat, kann er die Verbindung selbst erzwingen, wenn Sie dies wünschen.

34
theoobe

Wie von theoobe erwähnt, schließen einige Browser die Websockets nicht automatisch. Versuchen Sie nicht, clientseitig Ereignisse zu verarbeiten, bei denen das Browserfenster geschlossen wird. Es gibt derzeit keine zuverlässige Möglichkeit, dies zu tun, wenn Sie die Unterstützung der gängigen Desktop-Browser [~ # ~] und [~ # ~] in Betracht ziehen (z. B. onbeforeunload funktioniert nicht in Mobile Safari). Ich hatte gute Erfahrungen mit der serverseitigen Behandlung dieses Problems. Z.B. Wenn Sie Java EE verwenden, schauen Sie sich javax.websocket.Endpoint an, je nach Browser entweder die OnClose -Methode oder die OnError Methode wird aufgerufen, wenn Sie das Browserfenster schließen/neu laden.

3
artkoenig

Mit der Methode close von web socket, bei der Sie jede Funktion je nach Anforderung schreiben können.

var connection = new WebSocket('ws://127.0.0.1:1337');
    connection.onclose = () => {
            console.log('Web Socket Connection Closed');
        };
2