【问题标题】:Socket.IO: How do I remove a namespaceSocket.IO:如何删除命名空间
【发布时间】:2014-12-11 14:17:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js namespaces socket.io socket.io-1.0


    【解决方案1】:

    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 然后回退到默认命名空间。我不知道这是否是一个好的解决方案,但也许你可以稍微玩一下..

    【讨论】:

    • 检查另一个答案,这个不能正常工作。
    【解决方案2】:

    正如一些人在下面评论的,这仅适用于 Socket.IO 版本

    实际上,只需从服务器 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
    

    【讨论】:

    • 它只适用于一个问题,connectedNameSpaceSockets[socketId].disconnect(); 应该是MyNamespace.connected[socketId].disconnect()
    • @YiKai 你是对的...那是写一个快速回复的结果...:我很好奇一直没有人注意到...我会更新回复...谢谢
    • io.nsps 未定义,我正在使用 v3,请您帮忙
    • 从 v3 开始,这个答案似乎不再正确。
    • @gANDALF 不幸的是,我没有使用 v3。所以朱利安可能是对的。我还将在回复中添加仅针对版本 的提及
    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2011-03-04
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多