web-dev-qa-db-fra.com

Comment détecter et gérer "WebSocket est déjà à l'état FERMETURE ou FERMÉ" dans le nœud

Je cherchais une solution au problème "WebSocket est déjà à l'état FERMETURE ou FERMÉE" et j'ai trouvé ceci:

  1. Meteor WebSocket est déjà en erreur d'état CLOSING ou CLOSED
  2. WebSocket est déjà à l'état CLOSING ou CLOSED.

La réponse n ° 1 concerne strictement Meteor et n ° 2 ne contient pas de réponse ... J'ai une application serveur de nœud avec un 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);
  });
});

Et les clients se connectent comme ceci:

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);
});

Cependant, après quelques minutes, les clients se déconnectent de manière aléatoire et la fonction

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

Lance alors un "WebSocket est déjà à l'état CLOSING ou CLOSED.".

Je cherche un moyen de détecter et de gérer ces déconnexions et de tenter immédiatement de me reconnecter.

Quel est le moyen le plus correct et efficace de le faire?

14
adelriosantiago

Le moyen le plus simple est de vérifier si le socket est ouvert ou non avant l'envoi.

Par exemple, écrivez une fonction simple:

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

Ensuite, avant tout socket.send, assurez-vous qu'il est ouvert:

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

Vous pouvez également réécrire la fonction send comme cette réponse mais à ma façon, vous pouvez enregistrer ces situations.

Et pour votre seconde demande

essayez immédiatement de vous reconnecter

Vous ne pouvez pas le faire depuis le serveur.

Le code client doit surveiller l'état de WebSocket et appliquer une méthode de reconnexion en fonction de vos besoins.

Par exemple, vérifiez this VueJS library qui le fait bien. Regardez la section Enable ws reconnect automatiquement

1
yeya