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
(?i) bedeutet, dass die Groß-/Kleinschreibung nich...
Erstens: Stellen Sie zunächst sicher, dass die Ser...
Unter den Anweisungen meines Vorgesetzten übernah...
Die offizielle Website von Netease Kanyouxi (http...
Inhaltsverzeichnis 1. Zeigen Sie die Speicher-Eng...
Inhaltsverzeichnis Vorwort Webpack-Deb-Server Sta...
Ich war in den letzten beiden Tagen etwas beschäf...
Vorwort Die Ähnlichkeiten und Unterschiede zwisch...
1. Der Unterschied zwischen HTTP und HTTPS HTTP: ...
In diesem Artikel wird der spezifische Code von j...
#String-Verkettung concat(s1,s2); verkette die St...
Inhaltsverzeichnis Vorwort 1. Gründe: 2. Lösungsi...
Inhaltsverzeichnis Ziele für diesen Zeitraum 1. F...
Nachdem Vmvare die Festplattengröße der virtuelle...
Beim Entwurf von Tabellenstrukturen gehören numer...