it-swarm-eu.dev

Node.js et Socket.IO - Comment se reconnecter dès que la déconnexion se produit

Je construis 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éconnectera et je suis obligé de rafraîchir la page afin de rétablir la connexion.

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 recherche donc une approche basée sur les meilleures pratiques pour résoudre ce problème :)

Merci beaucoup, Dan

37
Dan

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

Lorsque j'ai utilisé socket.io, la déconnexion n'a pas eu lieu (uniquement lorsque j'ai fermé le serveur manuellement). Mais vous pouvez simplement vous reconnecter après, par exemple, 10 secondes en cas d'échec ou quelque chose lors d'un événement de déconnexion.

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

J'ai trouvé 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');
});
20
Alfred

[~ # ~] éditez [~ # ~] : socket.io a maintenant support de reconnexion intégré . Utiliser ça.

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

io.connect('http://localhost', {
  'reconnection': true,
  'reconnectionDelay': 500,
  'reconnectionAttempts': 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 assez bien fonctionner, même si je ne l'ai testé que sur le transport websocket.

90
nornagon

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. Voilà comment j'ai travaillé autour de cela.

//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();
});
4
abstraktor

Je sais que cela a une réponse acceptée, mais j'ai cherché pour toujours pour trouver ce que je cherchais et j'ai pensé que cela pourrait aider les autres.

Si vous voulez laisser votre client tenter de se reconnecter à l'infini (j'en avais besoin pour un projet où peu de clients seraient connectés, mais j'en avais besoin pour toujours se reconnecter si j'arrêtais le serveur).

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.");
  }
});
1
Applehat