node.js не отправляет сокет при отключении

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

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

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];
   });
});

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

Али


person Ali Alwash    schedule 26.03.2012    source источник


Ответы (1)


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

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];
   });
});

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

person Javo    schedule 26.03.2012
comment
если мне нужно отправить данные с клиента на сервер, как то, что он сделал в 1-м, не будет работать какое-либо решение? - person ujwal dhakal; 20.11.2015