Dan Dan - 4 months ago 17
Node.js Question

Node.js and Socket.IO - How to reconnect as soon as disconnect happens

I'm building a small prototype with node.js and socket.io. Everything is working well, the only issue I'm facing is that my node.js connection will disconnect and I'm forced to refresh the page in order to get the connection up and running again.

Is there a way to reestablish the connection as soon as the disconnect event is fired?

From what I've heard, this is a common issue. So, I'm looking for a best-practice approach to solving this problem :)

Thanks very much,
Dan

Answer

edit: Socket.io has builtin-support now

When I used socket.io the disconnect did not happen(only when i closed the server manually). But you could just reconnect after say for example 10 seconds on failure or something on disconnect event.

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

I came up with the following implementation:

client-side javascript

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

serverside(node.js):

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