Подтвердить что ты не робот

Событие отключения разъема Socket.IO

Не удается обработать это событие отключения, не знаю, почему сокет его не отправляет клиенту/клиенту, не отвечает!

Сервер

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

  socket.on('NewPlayer', function(data1) {

    online = online + 1;
    console.log('Online players : ' + online);
    console.log('New player connected : ' + data1);
    Players[data1] = data1;
    console.log(Players);

  });

  socket.on('DelPlayer', function(data) {

    delete Players[data];
    console.log(Players);
    console.log('Adios' + data);

  });

  socket.on('disconnect', function () {

      socket.emit('disconnected');
      online = online - 1;

  });

});

Client

 var socket = io.connect('http://localhost');

    socket.on('connect', function () { 

        person_name = prompt("Welcome. Please enter your name");

        socket.emit('NewPlayer', person_name);

        socket.on('disconnected', function() {

            socket.emit('DelPlayer', person_name);

        });

    });

Как вы можете видеть, когда клиент отключает объект Array [имя_пользователя], он должен быть удален, но его не

4b9b3361

Ответ 1

Хорошо, вместо того, чтобы идентифицировать игроков по имени трека с сокетами, через которые они подключились. У вас может быть реализация типа

Сервер

var allClients = [];
io.sockets.on('connection', function(socket) {
   allClients.push(socket);

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

      var i = allClients.indexOf(socket);
      allClients.splice(i, 1);
   });
});

Надеюсь, это поможет вам думать по-другому.

Ответ 2

Для таких, как @sha1, интересно, почему код OP не работает -

Логика OP для удаления проигрывателя на стороне сервера находится в обработчике события DelPlayer, и код, который испускает это событие (DelPlayer), находится внутри disconnected обратного вызова клиента.

Код на стороне сервера, который испускает это событие disconnected, находится внутри обратного вызова события disconnect, который запускается, когда сокет теряет соединение. Поскольку сокет уже потерял соединение, событие disconnected не доходит до клиента.


Принятое решение выполняет логику на событии disconnect на стороне сервера, которое запускается, когда сокет отключается, следовательно работает.

Ответ 3

Создайте карту или набор и, используя событие "on connection", установите для него каждый подключенный сокет, в обратном случае "один раз отключите", удалите этот сокет из карты, которую мы создали ранее.

import * as Server from 'socket.io';

const io = Server();
io.listen(3000);

const connections = new Set();

io.on('connection', function (s) {

  connections.add(s);

  s.once('disconnect', function () {
    connections.delete(s);
  });

});

Ответ 4

это работает для меня, надеюсь, это работает для вас

io.on('connection', function(socket){
    console.log('sessionID ' + socket.id + ' connected');
    socket.once('disconnect', function () {
        console.log('sessionID ' + socket.id + ' disconnected');
    });
});