2014-10-16 7 views
4

Мне нужно иметь возможность создавать и уничтожать пространства имен socket.io на лету. Легко найти информацию о том, как создать пространство имен, но я ничего не знаю о том, как я удаляю/отключаю пространство имен, чтобы освободить его память.Socket.IO: Как удалить пространство имен

Скажите, что я получил следующий код уже работает:

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

Как отключить/удалить пространство имен Socket.io созданных выше?

ответ

4

Метод 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]; 
}; 

Так что я предполагаю, что вы могли бы просто удалить его из массива в гнездо гипергликемии. Я тестировал его довольно быстро и, похоже, работает. Сокеты, которые уже подключены, сохраняют связь.

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

Подключение к /my-namespace затем падает обратно в пространство имен по умолчанию. Я не знаю, является ли это хорошим решением, но, может быть, вы можете немного поиграть с этим.

+0

Tx мат! Просто протестирован на v.1.3.7 и работает отлично! – JeanPaulDepraz

+2

Проверьте другой ответ, этот не работает должным образом. –

16

Фактически, просто удалив пространство имен с сервера nsps массив, вы не освободите память и сокеты по-прежнему останутся подключенными поскольку все еще указатели на пространство имен в памяти, так что это не будет мусора Собранный ... Если то, что вы хотите, чтобы полностью опорожнить ресурс вы должны

  1. отсоединить все разъемы от конкретного namespece
  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 
+1

Это должен быть правильный ответ –

+1

Он работает только с одной проблемой: 'connectedNameSpaceSockets [socketId] .disconnect();' должен быть 'MyNamespace.connected [socketId] .disconnect()' вместо этого. –

+0

@YiKai вы правы ... Это было результатом написания быстрого ответа ...: D Мне любопытно, как никто не заметил все это время ... Я обновлю ответ ... Спасибо – mitsos1os

Смежные вопросы