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;

});

});


клиент



 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[person_name] должен быть удален, но его не

787   3  

3 ответов:

ОК, вместо идентификации игроков по имени трек с сокетами, через которые они подключились. Вы можете иметь реализацию, как

сервер

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

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

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

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

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


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

import * as Server from 'socket.io';

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

export const connections = new Map();

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

  connections.set(c, c);

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

});

Comments

    Ничего не найдено.