套接字 IO 重新连接

Socket IO reconnect?

本文关键字:重新连接 IO 套接字      更新时间:2023-09-26
调用

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)重新连接,则连接不再有效。如何使连接正常工作?

好吧,你在这里有一个选择...

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

你已经有了答案,但我来到这里是因为插座。IO 客户端重新连接功能目前在节点中已损坏。

GitHub存储库上的活动错误显示,很多人在连接失败时没有收到事件,并且重新连接不会自动发生。

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

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

您可以通过以下客户端配置重新连接。

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

这是一个古老的问题,但我最近一直在为此苦苦挣扎,并在这里跌跌撞撞。最新版本的 socket.io (>2.0) 不再具有 socket.socket 属性,如此处所述。

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

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

我在重新连接套接字时遇到了问题。也许这种情况会帮助某人。我有这样的代码:

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