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

时间:2015-06-01 10:05:13

标签: socket.io

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

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

(使用lateste socket.io)

2 个答案:

答案 0 :(得分:4)

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

我必须这样做:

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

答案 1 :(得分:3)

不幸的是,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。