如何使用 socket.io 断开所有套接字服务端?

Posted

技术标签:

【中文标题】如何使用 socket.io 断开所有套接字服务端?【英文标题】:How to disconnect all sockets serve side using socket.io? 【发布时间】:2015-08-14 17:52:44 【问题描述】:

如何断开/关闭服务器端的所有套接字?

也许从服务器端重新启动 socket.io 模块?

(使用最新的socket.io)

【问题讨论】:

【参考方案1】:

不幸的是,socket.io 没有公开记录的接口,该接口从一个版本到下一个版本都是相同的,以执行迭代所有连接的套接字这样的基本功能。如果您想了解各种方法的全部历史,那么您可以在这个问题中关注整个版本历史:Socket.IO - how do I get a list of connected sockets/clients?,但您只需要注意适用于您的特定 socket.io 版本的答案使用它们,然后针对您的特定版本进行测试。


截至 2018 年 8 月,尝试仅使用 socket.io 中记录的接口,可以使用其中任何一个来获取已连接套接字的列表,然后遍历它们以断开它们,如上所示:

function getConnectedSockets() 
    return Object.values(io.of("/").connected);


getConnectedSockets().forEach(function(s) 
    s.disconnect(true);
);

根据客户端配置,客户端可能会尝试重新连接。


您也可以只维护自己的连接套接字列表:

const connectedSockets = new Set();

io.on('connection', s => 
    connectedSockets.add(s);
    s.on('disconnect', () => 
        connectedSockets.delete(s);
    );
);

function getConnectedSockets() 
    return Array.from(connectedSockets);


getConnectedSockets().forEach(function(s) 
    s.disconnect(true);
);

如果您使用的是旧版本的 socket.io(尤其是 v1.4 之前的版本),您将不得不对此进行测试以确保它在您的旧版本中工作,或者遵循上述参考中的版本历史并找到那里有一个针对您特定版本的 socket.io 的答案。

【讨论】:

【参考方案2】:

对我来说,jfriend00 的解决方案不起作用(截至今天)。

我必须这样做:

Object.keys(io.sockets.sockets).forEach(function(s) 
  io.sockets.sockets[s].disconnect(true);
);

【讨论】:

不幸的是,socket.io 通过它的各种版本进行了很多内部更改,因此您唯一的选择是找到一个专门记录的解决方案,或者您测试自己以适用于您的特定版本的套接字.io。在Socket.IO - how do I get a list of connected sockets/clients?Socket.IO - how do I get a list of connected sockets/clients?,如何通过各种版本的 socket.io 获取已连接的套接字列表的变化有着悠久而有序的历史。 此答案中关于 jfriend 答案的评论不再准确,因为 jfriend 的答案已于 2018 年 8 月更新。

以上是关于如何使用 socket.io 断开所有套接字服务端?的主要内容,如果未能解决你的问题,请参考以下文章

刷新时Socket.io断开连接?

Socket.io 不会在断开连接时向房间发送消息

socket io:如何传递参数来断开套接字事件?

Socket.io 断开事件和相关闭包的垃圾收集

如何在Socket.IO中一次性离开套接字连接的所有房间[关闭]

socket.io 服务器在注册客户端断开连接时非常延迟