【发布时间】:2015-08-14 17:52:44
【问题描述】:
如何断开/关闭服务器端的所有套接字?
也许从服务器端重新启动 socket.io 模块?
(使用最新的socket.io)
【问题讨论】:
标签: socket.io
如何断开/关闭服务器端的所有套接字?
也许从服务器端重新启动 socket.io 模块?
(使用最新的socket.io)
【问题讨论】:
标签: socket.io
不幸的是,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 的答案。
【讨论】:
对我来说,jfriend00 的解决方案不起作用(截至今天)。
我必须这样做:
Object.keys(io.sockets.sockets).forEach(function(s) {
io.sockets.sockets[s].disconnect(true);
});
【讨论】: