Socket IO reconnect?


Question

How to reconnect to socket io once disconnect has been called?

Here's the code

function initSocket(__bool){                    
    if(__bool == true){             
        socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});     
        socket.on('connect', function(){console.log('connected')});                                 
        socket.on('disconnect', function (){console.log('disconnected')});
    }else{
        socket.disconnect();
        socket = null;
    }
}   

If I do initSocket(true), it works. If I do initSocket(false), it disconnects. BUT THEN if I try to reconnect using initSocket(true), the connection does not work anymore. How can I get the connection to work?

1
35
11/24/2017 8:40:45 PM

Accepted Answer

Well, you have an option here ...

The first time you initialize the socket value you should connect with io.connect,

The next time ( after you've called disconnect once ), you should connect back with socket.socket.connect().

So your initSocket, should be something like

function initSocket(__bool){                    
    if(__bool){          
        if ( !socket ) {   
            socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});     
            socket.on('connect', function(){console.log('connected')});                                 
            socket.on('disconnect', function (){console.log('disconnected')});
        } else {
            socket.socket.connect(); // Yep, socket.socket ( 2 times )
        }
    }else{
        socket.disconnect();
        // socket = null; <<< We don't need this anymore
    }
} 
45
11/23/2017 6:55:01 PM

I know you already have an answer, but I arrived here because the socket.IO client reconnection feature is broken in node at the moment.

Active bugs on the github repo show that lots of people aren't getting events on connect failure, and reconnect isn't happening automatically.

To work around this, you can create a manual reconnect loop as follows:

var socketClient = socketioClient.connect(socketHost)

var tryReconnect = function(){

    if (socketClient.socket.connected === false &&
        socketClient.socket.connecting === false) {
        // use a connect() or reconnect() here if you want
        socketClient.socket.connect()
   }
}

var intervalID = setInterval(tryReconnect, 2000)

socketClient.on('connect', function () {
    // once client connects, clear the reconnection interval function
    clearInterval(intervalID)
    //... do other stuff
})

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon