Detaillierte Erläuterung der Gründe für die Trennung von JS WebSocket und des Heartbeat-Mechanismus

Detaillierte Erläuterung der Gründe für die Trennung von JS WebSocket und des Heartbeat-Mechanismus

1. Grund der Sperrung

Es gibt viele Gründe, warum die Verbindung zu WebSocket getrennt wird. Am besten drucken Sie den Fehler aus, wenn die Verbindung zu WebSocket getrennt wird.

ws.onclose = Funktion (e) {
  console.log('WebSocket getrennt: ' + e.code + ' ' + e.reason + ' ' + e.wasClean)
  console.log(e)
}

Fehlerstatuscode:

Wenn ein WebSocket getrennt wird, wird ein CloseEvent ausgelöst. CloseEvent wird über WebSockets an den Client gesendet, wenn die Verbindung geschlossen wird. Es wird im Onclose-Ereignislistener des WebSocket-Objekts verwendet. Das Codefeld von CloseEvent gibt den Grund an, warum die WebSocket-Verbindung getrennt wurde. Der Grund für die Trennung kann anhand dieses Feldes analysiert werden.

Es gibt drei Felder in CloseEvent, die Aufmerksamkeit erfordern. Durch die Analyse dieser drei Felder können wir im Allgemeinen den Grund für die Trennung finden.

CloseEvent.code: Code ist der Fehlercode, der ein Integer-Typ ist

CloseEvent.reason: reason ist der Grund für die Trennung, eine Zeichenfolge

CloseEvent.wasClean: wasClean gibt an, ob die Trennung normal war. Dabei handelt es sich um einen Booleschen Wert. Wenn eine abnormale Trennung auftritt, ist der Wert im Allgemeinen „false“.

Statuscode Name beschreiben
0–999 Reserviertes Segment, nicht verwendet.
1000 SCHLIESSEN_NORMAL Normale Schließung; egal zu welchem ​​Zweck der Link erstellt wurde, der Link hat seine Aufgabe erfolgreich abgeschlossen.
1001 SCHLIESSEN_WEGGEHEN Das Terminal wird verlassen, entweder aufgrund eines Serverfehlers oder weil der Browser die Seite verlässt, die die Verbindung geöffnet hat.
1002 CLOSE_PROTOCOL_ERROR Die Verbindung wurde aufgrund eines Protokollfehlers abgebrochen.
1003 SCHLIESSEN_NICHT UNTERSTÜTZT Die Verbindung wurde beendet, weil ein nicht zulässiger Datentyp empfangen wurde (z. B. wurden Binärdaten auf einem Terminal empfangen, das nur Textdaten akzeptiert).
1004 Reserviert. Die Bedeutung kann zukünftig definiert werden.
1005 CLOSE_NO_STATUS Reserviert. Zeigt an, dass der erwartete Statuscode nicht empfangen wurde.
1006 CLOSE_ABNORMAL Reserviert. Wird verwendet, wenn ein Statuscode erwartet wird und die Verbindung abnormal geschlossen wurde (d. h., es wurde kein Close-Frame gesendet).
1007 Nicht unterstützte Daten Die Verbindung wurde beendet, weil Daten empfangen wurden, die nicht dem angegebenen Format entsprachen (z. B. eine Textnachricht, die andere Daten als UTF-8 enthält).
1008 Richtlinienverstoß Die Verbindung wurde aufgrund des Empfangs von Daten getrennt, die nicht dem Protokoll entsprechen. Dies ist ein allgemeiner Statuscode, der in Situationen verwendet wird, in denen die Statuscodes 1003 und 1009 nicht geeignet sind.
1009 SCHLIESSEN_ZU_GROSS Die Verbindung wurde aufgrund des Empfangs eines zu großen Datenrahmens beendet.
1010 Fehlende Erweiterung Der Client erwartete, dass der Server eine oder mehrere Erweiterungen aushandelt, der Server konnte diese jedoch nicht verarbeiten, sodass die Verbindung zum Client getrennt wurde.
1011 Interner Fehler Die Verbindung zum Server wurde getrennt, da beim Client ein unerwarteter Zustand auftrat, der die Ausführung der Anforderung verhinderte.
1012 Dienstneustart Die Verbindung zum Server wurde aufgrund eines Neustarts getrennt.
1013 Versuchen Sie es später erneut Die Verbindung zum Server wurde aus vorübergehenden Gründen (z. B. einer Serverüberlastung) getrennt, sodass die Verbindung zu einigen Clients unterbrochen wurde.
1014 Vom WebSocket-Standard für die zukünftige Verwendung reserviert.
1015 TLS-Handshake Behalten. Zeigt an, dass die Verbindung geschlossen wurde, weil der TLS-Handshake nicht abgeschlossen werden konnte (z. B. konnte das Serverzertifikat nicht überprüft werden).
1016–1999 Vom WebSocket-Standard für die zukünftige Verwendung reserviert.
2000–2999 Für die Verwendung durch die WebSocket-Erweiterung reserviert.
3000–3999 Kann von Bibliotheken oder Frameworks verwendet werden.? Sollte nicht von Anwendungen verwendet werden. Kann bei IANA nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ registriert werden.
4000–4999 Kann von Anwendungen verwendet werden.

2. Herzschlag hinzufügen

var lockReconnect = false; // Wiederholte ws-Verbindungen vermeiden var ws = null; // Feststellen, ob der aktuelle Browser WebSocket unterstützt
var wsUrl = serverConfig.socketUrl;
createWebSocket(wsUrl); //Mit ws verbinden

Funktion erstelleWebSocket(URL) {
    versuchen{
        if('WebSocket' im Fenster){
            ws = neuer WebSocket(URL);
        }
        : InitEventHandle();
    }fangen(e){
        erneut verbinden (URL);
        konsole.log(e);
    }     
}

Funktion initEventHandle() {
    ws.onclose = Funktion () {
        erneut verbinden(wsUrl);
        console.log("llws-Verbindung geschlossen!"+new Date().toLocaleString());
    };
    ws.onerror = Funktion () {
        erneut verbinden(wsUrl);
        console.log("llws-Verbindungsfehler!");
    };
    ws.onopen = Funktion () {
        heartCheck.reset().start(); //Zurücksetzen der Herzschlagerkennung console.log("llws-Verbindung erfolgreich!"+new Date().toLocaleString());
    };
    ws.onmessage = function (event) { //Wenn eine Nachricht empfangen wird, wird die Heartbeat-Erkennung zurückgesetzt heartCheck.reset().start(); //Der Empfang einer beliebigen Nachricht bedeutet, dass die aktuelle Verbindung normal ist console.log("llws hat die Nachricht empfangen:" + event.data);
        wenn(event.data!='pong'){
            let Daten = jsON.parse(Ereignis.Daten);
        }
    };
}
// Auf Fensterschließereignisse achten. Wenn das Fenster geschlossen wird, schließen Sie aktiv die WebSocket-Verbindung, um zu verhindern, dass der Server eine Ausnahme auslöst, wenn das Fenster geschlossen wird, bevor die Verbindung getrennt wird.
window.onbeforeunload = Funktion() {
    ws.schließen();
}  

Funktion erneut verbinden(URL) {
    wenn (lockReconnect) zurückgeben;
    lockReconnect = wahr;
    setTimeout(function () { //Wenn die Verbindung fehlschlägt, wird die Verbindung immer wieder hergestellt. Legen Sie eine Verzögerung fest, um zu viele Anfragen zu vermeiden. createWebSocket(url);
        lockReconnect = falsch;
    }, 2000);
}

//Herzschlagerkennung var heartCheck = {
    timeout: 1000, //Sende jede Minute einen Heartbeat timeoutObj: null,
    serverTimeoutObj: null,
    zurücksetzen: Funktion(){
        Zeitüberschreitung löschen(dieses.timeoutObj);
        Zeitüberschreitung löschen(dieses.ServerTimeoutObj);
        gib dies zurück;
    },
    Start: Funktion(){
        var selbst = dies;
        dies.timeoutObj = setTimeout(Funktion(){
            //Hier wird ein Heartbeat gesendet und nachdem das Backend ihn empfangen hat, wird eine Heartbeat-Nachricht zurückgegeben.
            //onmessage erhält den zurückgegebenen Heartbeat, was bedeutet, dass die Verbindung normal istws.send("ping");
            console.log("Ping!")
            self.serverTimeoutObj = setTimeout(function(){//Wenn es nach einer bestimmten Zeit nicht zurückgesetzt wird, bedeutet dies, dass das Backend die Verbindung aktiv getrennt hat ws.close(); //Wenn onclose eine erneute Verbindung ausführt, müssen wir nur ws.close() ausführen. Wenn die erneute Verbindung direkt ausgeführt wird, wird onclose ausgelöst, was zu zwei erneuten Verbindungen führt}, self.timeout)
        }, dieses.Timeout)
    }
}
    //Methode, die nach dem Empfang der Client-Nachricht aufgerufen wird @OnMessage  
    public void onMessage(String Nachricht, Session Sitzung) {  
        wenn (Nachricht.equals("ping")) {
        }anders{
        . . . .
        }
   }

Das System hat festgestellt, dass die Verbindung zum WebSocket automatisch jede Minute getrennt wird. Ich habe viele Blogs durchsucht und alle sagten, ich solle das Proxy_Read_Timeout von Nginx festlegen, aber diese Zeit ist zu lang und beeinträchtigt die Serverleistung. Die Heartbeat-Paketmethode wird verwendet, sodass der Client automatisch jede Minute eine Ping-Nachricht an den Server sendet und der Server ein Pong zurückgeben muss. Das Problem ist lösbar.

Oben finden Sie eine ausführliche Erläuterung der Gründe für die Trennung von JS WebSocket und des Heartbeat-Mechanismus. Weitere Informationen zu den Gründen für die Trennung von JS WebSocket und dem Heartbeat-Mechanismus finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So verwenden Sie JS WebSocket zur Implementierung eines einfachen Chats
  • js realisiert die Echtzeitübertragung von MP3-Aufnahmen über WebSocket + einfachen Wellenformeffekt
  • Natives Node.js verwendet WebSocket-Code-Sharing
  • So verwenden Sie einen auf Express basierenden WebSocket in node.js
  • JS implementiert den Effekt der Echtzeit-Nachrichtenaufforderung für WebSocket-Long-Polling
  • Verbesserte Version des Echtzeit-Chatsystems nodejs+websocket
  • Websocket + node.js zur Implementierung einer Problemberatung im Echtzeit-Chatsystem
  • Implementierung der WebSocket-Kommunikation basierend auf Node.js
  • Node.js WebSocket verwendet die Socket.io-Bibliothek, um einen Echtzeit-Chatroom zu implementieren
  • Anwendungsbeispiele für Javascript WebSocket (kurzes Einführungstutorial)

<<:  So installieren Sie das Programm setup.py unter Linux

>>:  So stellen Sie Python-Crawler-Skripte unter Linux bereit und richten geplante Aufgaben ein

Artikel empfehlen

So ersetzen Sie alle Tags im HTML-Text

(?i) bedeutet, dass die Groß-/Kleinschreibung nich...

Lösungen für Websites mit hohem Datenverkehr

Erstens: Stellen Sie zunächst sicher, dass die Ser...

Lösen Sie das Problem verstümmelter Daten bei der MySQL-Datenbankmigration

Unter den Anweisungen meines Vorgesetzten übernah...

Verwenden von CSS3 zum Erstellen von Header-Animationseffekten

Die offizielle Website von Netease Kanyouxi (http...

Auswahl der MySQL-Tabellentyp-Speicher-Engine

Inhaltsverzeichnis 1. Zeigen Sie die Speicher-Eng...

Implementierung von webpack-dev-server zum Erstellen eines lokalen Servers

Inhaltsverzeichnis Vorwort Webpack-Deb-Server Sta...

Beispiele für die Verwendung temporärer Tabellen in MySQL

Ich war in den letzten beiden Tagen etwas beschäf...

7 interessante Möglichkeiten, versteckte Elemente in CSS zu erreichen

Vorwort Die Ähnlichkeiten und Unterschiede zwisch...

Detaillierter Prozess zum Konfigurieren eines HTTPS-Zertifikats unter Nginx

1. Der Unterschied zwischen HTTP und HTTPS HTTP: ...

js realisiert Warenkorb-Add- und Subtraktions- sowie Preisberechnungsfunktionen

In diesem Artikel wird der spezifische Code von j...

Instanzmethode für MySQL-String-Verkettung und Festlegen von Nullwerten

#String-Verkettung concat(s1,s2); verkette die St...

So erweitern Sie die Festplattengröße einer virtuellen Maschine

Nachdem Vmvare die Festplattengröße der virtuelle...

Die Tücken der automatischen Inkrementierung numerischer MySQL-Typen

Beim Entwurf von Tabellenstrukturen gehören numer...