node.js не отправляет сокет при отключении - PullRequest
10 голосов
/ 26 марта 2012

Когда кто-то подключается к серверу узла, я сохраняю массив со всеми сокетами.Таким образом, я могу транслировать сообщения всем, когда это необходимо, или перебирать пользователей, чтобы посчитать количество онлайн-пользователей и т. Д.

Все это работает нормально, но когда срабатывает событие отключения, я нене получить сокет в моих аргументах.Есть ли другой способ узнать, какой сокет только что отключен?

var allClients = [];

io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function(socket) {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      delete allClients[i];
   });
});

Конечно, приведенный выше пример не работает, потому что событие отключения не дает аргумента сокета (или любого другого аргумента).Так есть ли другое событие, которое произошло перед разъединением, где сокет все еще там?

Али

1 Ответ

23 голосов
/ 26 марта 2012

У вас уже есть сокет, потому что обработчик разъединения объявлен в области событий соединения. Попробуйте удалить параметр, передаваемый обработчику «отключить», вы сможете работать с параметром сокета из обработчика подключения.

io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function() {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      delete allClients[i];
   });
});

Кроме того, вам не нужен массив сокетов для трансляции, вы можете использовать комнаты для группировки сокетов и трансляции на все сокеты в этой комнате.

...