9

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

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

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

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

4

2 回答 2

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
于 2016-04-08T12:42:06.717 回答
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然后回退到默认命名空间。我不知道这是否是一个好的解决方案,但也许你可以玩一点..

于 2014-10-16T10:01:13.307 回答