web-dev-qa-db-de.com

Vorgehensweise zum Fangen und Behandeln von "WebSocket befindet sich bereits im Status CLOSING oder CLOSED" im Knoten

Ich habe nach einer Lösung für das Problem "WebSocket befindet sich bereits im Status CLOSING oder CLOSED" gesucht und habe Folgendes gefunden:

  1. Meteor WebSocket befindet sich bereits im Status CLOSING oder CLOSED
  2. WebSocket befindet sich bereits im Status CLOSING oder CLOSED.

Antwort # 1 ist für Meteor eng verwandt und # 2 hat keine Antworten ... Ich habe eine Knotenserver-App mit einem Socket:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });

wss.on('connection', function connection(socket) {
  socket.on('message', function incoming(data) {
    console.log('Incoming data ', data);
  });
});

Und Kunden verbinden sich wie folgt:

const socket = new WebSocket('ws://localhost:3090'); //Create WebSocket connection

//Connection opened
socket.addEventListener('open', function(event) {
  console.log("Connected to server");
});

//Listen to messages
socket.addEventListener('message', function(event) {
  console.log('Message from server ', event);
});

Nach einigen Minuten trennen sich die Clients jedoch zufällig und die Funktion

socket.send(JSON.stringify(data));

Würfelt dann ein "WebSocket befindet sich bereits im Status CLOSING oder CLOSED.".

Ich suche nach einer Möglichkeit, diese Unterbrechungen zu erkennen und zu beheben, und ich versuche sofort, erneut eine Verbindung herzustellen.

Was ist der beste und effizienteste Weg, dies zu tun?

14
adelriosantiago

Am einfachsten prüfen Sie vor dem Senden, ob die Steckdose geöffnet ist oder nicht.

Zum Beispiel - schreiben Sie eine einfache Funktion:

function isOpen(ws) { return ws.readyState === ws.OPEN }

Vergewissern Sie sich dann vor jedem socket.send, dass es geöffnet ist:

if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));

Sie können auch die send-Funktion wie diese Antwort umschreiben, aber auf meine Art und Weise können Sie diese Situationen protokollieren.

Und für Ihre zweite Anfrage

versuchen Sie sofort, erneut eine Verbindung herzustellen

Es gibt keine Möglichkeit, dies vom Server aus zu erledigen.

Der Clientcode sollte den WebSocket-Status überwachen und abhängig von Ihren Anforderungen eine Wiederverbindungsmethode anwenden.

Zum Beispiel - check this VueJS-Bibliothek, die es gut macht. Schauen Sie sich den Abschnitt Enable ws reconnect automatisch an

1
yeya