38 votes

Node.js et Socket.IO - Comment se reconnecter dès qu'une déconnexion se produit ?

Je suis en train de construire un petit prototype avec node.js et socket.io. Tout fonctionne bien, le seul problème auquel je suis confronté est que ma connexion node.js se déconnecte et je suis obligé de rafraîchir la page pour que la connexion soit à nouveau opérationnelle.

Existe-t-il un moyen de rétablir la connexion dès que l'événement de déconnexion est déclenché ?

D'après ce que j'ai entendu, c'est un problème courant. Je suis donc à la recherche d'une meilleure approche pour résoudre ce problème :)

Merci beaucoup, Dan

91voto

nornagon Points 4744

EDIT : socket.io a maintenant support de reconnexion intégré . Utilisez cela.

par exemple (ce sont les valeurs par défaut) :

io.connect('http://localhost', {
  'reconnect': true,
  'reconnection delay': 500,
  'max reconnection attempts': 10
});

C'est ce que j'ai fait :

~~socket.on('disconnect', function () { console.log('reconnecting...') socket.connect() }) socket.on('connect_failed', function () { console.log('connection failed. reconnecting...') socket.connect() })~~

Cela semble fonctionner assez bien, bien que je ne l'aie testé que sur le transport websocket.

20voto

Alfred Points 32190

edit : Socket.io a maintenant un support intégré.

Lorsque j'utilisais socket.io, la déconnexion ne se produisait pas (seulement lorsque je fermais le serveur manuellement). Mais vous pourriez simplement vous reconnecter après, par exemple, 10 secondes en cas d'échec ou autre sur l'événement de déconnexion.

socket.on('disconnect', function(){
   // reconnect
});

Je suis arrivé à l'implémentation suivante :

javascript côté client

var connected = false;
const RETRY_INTERVAL = 10000;
var timeout;

socket.on('connect', function() {
  connected = true;
  clearTimeout(timeout);
  socket.send({'subscribe': 'schaftenaar'});
  content.html("<b>Connected to server.</b>");
});

socket.on('disconnect', function() {
  connected = false;
  console.log('disconnected');
  content.html("<b>Disconnected! Trying to automatically to reconnect in " +                   
                RETRY_INTERVAL/1000 + " seconds.</b>");
  retryConnectOnFailure(RETRY_INTERVAL);
});

var retryConnectOnFailure = function(retryInMilliseconds) {
    setTimeout(function() {
      if (!connected) {
        $.get('/ping', function(data) {
          connected = true;
          window.location.href = unescape(window.location.pathname);
        });
        retryConnectOnFailure(retryInMilliseconds);
      }
    }, retryInMilliseconds);
  }

// start connection
socket.connect();
retryConnectOnFailure(RETRY_INTERVAL);

côté serveur (node.js) :

// express route to ping server.
app.get('/ping', function(req, res) {
    res.send('pong');
});

5voto

abstraktor Points 521

Commencez à vous reconnecter même si la première tentative échoue.

Si la première tentative de connexion échoue, socket.io 0.9.16 n'essaie pas de se reconnecter pour une raison quelconque. Voici comment j'ai contourné ce problème.

//if this fails, socket.io gives up
var socket = io.connect();

//tell socket.io to never give up :)
socket.on('error', function(){
  socket.socket.reconnect();
});

1voto

Applehat Points 437

Je sais que la réponse à cette question est déjà connue, mais j'ai cherché pendant des heures pour trouver ce que je cherchais et j'ai pensé que cela pourrait aider d'autres personnes.

Si vous voulez laisser votre client tenter de se reconnecter à l'infini (j'en ai eu besoin pour un projet où peu de clients étaient connectés, mais j'avais besoin qu'ils se reconnectent toujours si je mettais le serveur hors service).

var max_socket_reconnects = 6;

var socket = io.connect('http://foo.bar',{
    'max reconnection attempts' : max_socket_reconnects
});

socket.on("reconnecting", function(delay, attempt) {
  if (attempt === max_socket_reconnects) {
    setTimeout(function(){ socket.socket.reconnect(); }, 5000);
    return console.log("Failed to reconnect. Lets try that again in 5 seconds.");
  }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X