【问题标题】:Socket IO reconnect?套接字 IO 重新连接?
【发布时间】:2019-05-17 19:02:12
【问题描述】:

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

【问题讨论】:

标签: javascript node.js socket.io


【解决方案1】:

嗯,你可以在这里选择......

第一次初始化套接字值时你应该用io.connect连接,

下一次(在您调用了一次 disconnect 之后),您应该使用 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
    }
} 

【讨论】:

    【解决方案2】:

    我知道你已经有了答案,但我来到这里是因为 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
    })
    

    【讨论】:

    • 请注意,此答案回答 OP 的问题(谁想要手动重新连接),并且(根据我的经验)socket.io 自动重新连接现在效果很好。跨度>
    【解决方案3】:

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

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

    【讨论】:

    • 我不认为forceNew 意味着重新连接。我相信这意味着每次调用此语句时都创建一个新套接字,因为通常io.connect() 如果您再次调用它,将返回相同的套接字。
    【解决方案4】:

    这是一个老问题,但我最近一直在努力解决这个问题并在这里偶然发现。正如here 指出的那样,最新版本的socket.io (>2.0) 不再具有socket.socket 属性。

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

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

    【讨论】:

    • 这是最新版本的socket.io的工作解决方案,确认版本4.4.0
    【解决方案5】:

    我遇到了 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);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 2013-04-17
      • 2012-11-22
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多