1. Grund der SperrungEs 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“.
2. Herzschlag hinzufügenvar 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 installieren Sie das Programm setup.py unter Linux
>>: So stellen Sie Python-Crawler-Skripte unter Linux bereit und richten geplante Aufgaben ein
Das Kubernetes-Team hat vor Kurzem angekündigt, d...
Viele Freunde berichten von folgendem Fehler, wen...
Inhaltsverzeichnis Vorwort Einführung in Bézierku...
Beginnen wir mit einer Frage Als ich vor fünf Jah...
Nur Informationen zum Mount-Verzeichnis des Docke...
Inhaltsverzeichnis Der Rendering-Mechanismus des ...
Vorwort Kürzlich stieß ich bei der Arbeit auf ein...
Inhaltsverzeichnis Überblick 0. Grundlagen von Ja...
Schauen Sie sich zunächst das Wirkungsdiagramm an...
Die Barrierefreiheit von Webseiten scheint etwas z...
Erstellen des Projekts Führen Sie die Befehlszeil...
Inhaltsverzeichnis 1. Verwenden Sie Skripte, um T...
Inhaltsverzeichnis Matlab-Centroid-Algorithmus Da...
Inhaltsverzeichnis Vorwort 1. Grundkenntnisse zu ...
Inhaltsverzeichnis Komplexe Abfrage und schrittwe...