Socket IO 重新连接?

49

如何在调用 disconnect 后重新连接到 Socket.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) 重新连接,连接将不再起作用。如何使连接正常工作?


1
它已经内置在库中。请参见 https://dev59.com/EG855IYBdhLWcg3wSSOl#5149185 - Matt
7
我不希望它在断开连接后重新连接!我想要能够控制何时连接和断开连接。 - Eric
Web应用程序加载了很多内容,因此根据情况,我希望在用户单击某些东西时断开连接,然后重新连接。 - Eric
啊,我明白了。那么,嗯,为什么呢?难道websocket的目的不是为了持久化并避免这些连接/断开的开销吗? - Matt
7
这只是一个套接字连接,我应该能够随时连接和断开连接 :) - Eric
显示剩余3条评论
5个回答

53

好的,您在这里有一个选择...

第一次初始化套接字值时,您应该使用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
    }
} 

16

我知道你已经有了答案,但我来到这里是因为目前在Node中,socket.IO客户端重新连接功能存在问题。

Github上的活动bug显示许多人在连接失败时没有收到事件,并且自动重新连接没有发生。

为了解决这个问题,您可以按照以下方式创建手动重新连接循环:

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

请注意,此答案回答OP的问题(他想手动重新连接),而且(根据我的经验)socket.io自动重新连接现在运行良好。 - user202729

5
您可以按照客户端配置重新连接。
// 0.9  socket.io version
io.connect(SERVER_IP,{'force new connection':true });

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

8
我认为forceNew不代表重新连接,而是在每次调用该语句时创建一个新的socket,因为通常情况下,如果第二次调用io.connect(),它会返回相同的socket。 - Thalis K.

2
这是一个老问题,但我最近遇到了困难并在这里发现了解决方法。最新版本的socket.io(> 2.0)不再有socket.socket属性,如这里所指出的。
我正在使用socket.io-client 2.2.0,遇到了一种情况,即套接字似乎已连接(属性socket.connected = true),但它不能与服务器通信。
因此,我的解决方案是调用socket.close()和socket.open。这些命令强制断开连接并建立新连接。

这是一个可用的解决方案,适用于最新版本的socket.io,并确认适用于4.4.0版本。 - amrendra

0

我遇到了socket-io重新连接的问题。也许这个案例能帮助到某些人。我的代码如下:

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

这是错误的,因为在分配回调之间存在延迟。在数据库初始化之前,可能会丢失一些消息。修复它的正确方法是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接