Socket.IO:如何删除命名空间

9

我需要能够动态构建和销毁socket.io名称空间。容易找到如何创建名称空间的信息,但我找不到有关如何删除/断开名称空间以释放其内存的任何信息。

假设我已经运行了以下代码:

var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
  console.log('someone connected'):
});
nsp.emit('hi', 'everyone!');

如何断开/删除上面创建的socket.io命名空间?
3个回答

39

正如下面的一些评论所指出的那样,这仅适用于Socket.IO版本<3

实际上,仅通过从服务器的nsps数组中删除命名空间,并不能释放任何内存,因为仍然存在对命名空间的指针,所以它不会被垃圾回收...如果你想完全清空资源,你应该:

  1. 断开所有与特定命名空间相关的套接字连接
  2. 删除所有事件监听器,因为它是一个扩展了EventEmitter类的对象
  3. 从服务器的nsps数组中删除它

例如

const MyNamespace = io.of('/my-namespace'); // Get Namespace
const connectedNameSpaceSockets = Object.keys(MyNamespace.connected); // Get Object with Connected SocketIds as properties
connectedNameSpaceSockets.forEach(socketId => {
    MyNamespace.connected[socketId].disconnect(); // Disconnect Each socket
});
MyNamespace.removeAllListeners(); // Remove all Listeners for the event emitter
delete io.nsps['/my-namespace']; // Remove from the server namespaces

3
它只有一个问题,connectedNameSpaceSockets[socketId].disconnect(); 应该改为 MyNamespace.connected[socketId].disconnect() - Yi Kai
1
@YiKai 你说得对...那是因为我匆忙回复的结果... :D 我很好奇这么长时间以来没人注意到...我会更新回复...谢谢 - mitsos1os
io.nsps未定义,我正在使用v3,请帮忙。 - gANDALF
从v3版本开始,这个答案似乎不再正确。 - Julian Knight
@gANDALF 很遗憾我没有使用过v3。所以Julian可能是正确的。我也会在回复中添加一句话,说明这仅适用于<3版本。 - mitsos1os

7
io.of 方法只是创建一个数组元素:
Server.prototype.of = function(name, fn){
  if (String(name)[0] !== '/') name = '/' + name;

  if (!this.nsps[name]) {
    debug('initializing namespace %s', name);
    var nsp = new Namespace(this, name);
    this.nsps[name] = nsp;
  }
  if (fn) this.nsps[name].on('connect', fn);
  return this.nsps[name];
};

所以,我认为你可以从socket io的数组中删除它。我做了一个很快的测试,看起来似乎可行。已经连接的套接字将保持连接。

delete io.nsps['/my-namespace'];

连接到/my-namespace,然后回退到默认命名空间。我不知道这是否是一个好的解决方案,但也许你可以稍微尝试一下。


3
请查看其他答案,这个答案无法正常工作。 - Joe Thomas

1

使用 Socket.IO v3 及以上版本,您可以这样做:

// disconnect all sockets from this namespace
io.of('/the-namespace').local.disconnectSockets();

// remove the namespace
io._nsps.delete('/my-namespace');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接