我需要能够即时构建和销毁socket.io名称空间。很容易找到如何创建命名空间的信息,但我没有发现如何删除/断开命名空间以释放其内存。
说我已经运行了以下代码:
var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected'):
});
nsp.emit('hi', 'everyone!');
如何断开/删除上面创建的socket.io命名空间?
答案 0 :(得分:27)
实际上只是从服务器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
答案 1 :(得分: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
然后回退到默认命名空间。我不知道这是否是一个很好的解决方案,但也许你可以稍微玩一下......