如何检测 socket.io 上的断开连接?

Posted

技术标签:

【中文标题】如何检测 socket.io 上的断开连接?【英文标题】:How can I detect disconnects on socket.io? 【发布时间】:2013-11-29 05:20:18 【问题描述】:

我在我的项目中使用 socket.io。我打开了重新连接功能。如果用户与服务器断开连接,我想显示警报(您的互联网连接丢失。尝试重新连接)。如果用户再次重新连接,我想再显示一个警报(别担心,您已连接)。

我该怎么做?

【问题讨论】:

***.com/a/35124953/3904109 看这里 【参考方案1】:

在您使用的客户端上检测

  // CLIENT CODE
  socket.on('disconnect', function()
      // Do stuff (probably some jQuery)
  );

对于 node.js 服务器,它也与上面的代码完全相同。

如果您出于某种原因想要检测用户断开连接并将其显示给其他人,则需要使用服务器来检测离开的人,然后使用以下方式向其他人发送一条消息:

socket.on('disconnect', function()
    socket.broadcast.to(roomName).emit('user_leave', user_name: "johnjoe123");
);

希望对你有帮助

【讨论】:

感谢您的回复。现在断开部分可以,但我该如何重新连接部分? 服务器如何知道是否完全断开连接或客户端的 Internet 连接是否中断? @bluejamesbond 如果是完全断开连接,您可以从客户端发出自定义断开连接事件,在服务器上捕获它并通知其他人。【参考方案2】:

socket.io 有一个disconnect 事件,把它放在你的connect 块中:

socket.on('disconnect', function () 
    //do stuff
);

【讨论】:

请注意,如果客户端本身失去与服务器的连接,则事件 disconnect 在套接字重试超时之前不会触发。【参考方案3】:

我就是这样处理这个问题的。我在客户端创建了一个发送者,它在服务器上调用心跳。

socket.on('heartbeat', function() 
        // console.log('heartbeat called!');
        hbeat[socket.id] = Date.now();
        setTimeout(function() 
            var now = Date.now();
            if (now - hbeat[socket.id] > 5000) 
                console.log('this socket id will be closed ' + socket.id);
                if (addedUser) 
                    --onlineUsers;
                    removeFromLobby(socket.id);

                    try 
                        // this is the most important part
                        io.sockets.connected[socket.id].disconnect();
                     catch (error) 
                        console.log(error)
                    
                
            
            now = null;
        , 6000);
    );

我找到了这个代码函数来调用:

io.sockets.connected[socket.id].disconnect();

【讨论】:

以上是关于如何检测 socket.io 上的断开连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测Socket IO中的重新连接事件

使用 Socket.io 检测(客户端)连接断开

如何在 android 上检查 socket.io 连接或断开连接?

nodejs socket 怎么检测客户端主动断开连接

Socket.io 客户端在突然断开连接后无法重新连接到服务器

如何检测win32上的datacard连接和断开事件?