套接字IO重新连接?

时间:2012-05-03 18:52:14

标签: javascript node.js socket.io

如果在调用disconnect后如何重新连接到套接字io?

这是代码

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

如果我initSocket(true),它就有效。如果我执行initSocket(false),则会断开连接。但是,如果我尝试使用initSocket(true)重新连接,则连接不再起作用。如何才能使连接正常工作?

5 个答案:

答案 0 :(得分:45)

嗯,你有一个选择......

首次初始化套接字值时,您应该与io.connect

连接

下次(在您断开一次断开连接后),您应该与socket.socket.connect()连接。

所以你的initSocket应该是

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
    }
} 

答案 1 :(得分:13)

我知道你已经有了答案,但我到了这里是因为socket.IO客户端重新连接功能目前在节点中被破坏了。

github repo上的活动错误表明很多人没有在连接失败时获取事件,并且没有自动重新连接。

要解决此问题,您可以按如下方式创建手动重新连接循环:

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

答案 2 :(得分:6)

您可以按照客户端配置重新连接。

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

// 1.0 socket.io version
io.connect(SERVER_IP,{'forceNew':true });

答案 3 :(得分:1)

这是一个古老的问题,但是我最近对此很挣扎,在这里偶然发现。指出here的最新版本的socket.io(> 2.0)不再具有socket.socket属性。

我正在使用socket.io-client 2.2.0,并且遇到套接字似乎已连接(属性socket.connected = true)但未与服务器通信的情况。

因此,要解决此问题,我的解决方案是调用socket.close()socket.open。这些命令会强制断开连接并重新建立连接。

答案 4 :(得分:0)

我遇到了socket-io重新连接的问题。可能这种情况会对某人有所帮助。我有这样的代码:

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

这是错误的,因为开放端口分配的回调之间存在延迟。在初始化DB之前,某些消息可能会丢失。解决问题的正确方法是:

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