Socket IO reconnect?

2019-01-21 06:08发布

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?

4条回答
Fickle 薄情
2楼-- · 2019-01-21 06:19

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
    }
} 
查看更多
女痞
3楼-- · 2019-01-21 06:19

You can reconnect by following client side config.

// 0.9  socket.io version
io.connect(SERVER_IP,{'force new connection':true });

// 1.0 socket.io version
io.connect(SERVER_IP,{'forceNew':true });
查看更多
倾城 Initia
4楼-- · 2019-01-21 06:20

I had an issue with socket-io reconnect. May be this case will help someone. I had code like this:

var io = require('socket.io').listen(8080);
DB.connect(function () {
    io.sockets.on('connection', function (socket) {
        initSockets(socket);
    });
});

this is wrong, becase there is a delay between open port assigned callbacks. Some of messages may be lost before DB gets initialized. The right way to fix it is:

var io = null;
DB.connect(function () {
    io = require('socket.io').listen(8080);
    io.sockets.on('connection', function (socket) {
        console.log("On connection");
        initSockets(socket);
    });
});
查看更多
不美不萌又怎样
5楼-- · 2019-01-21 06:36

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
})
查看更多
登录 后发表回答