Socket.IO manejo del evento de desconexión


No puede manejar este evento de desconexión, no sé por qué socket no se envía al cliente / cliente no responde!

Servidor

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;

  });

});

Cliente

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

        });

    });

Como puede ver cuando un cliente desconecta el objeto Array [person_name] debe eliminarse, pero no es

Author: Na7coldwater, 2013-06-25

3 answers

Ok, en lugar de identificar a los jugadores por el nombre de la pista con sockets a través de los cuales se han conectado. Puede tener una implementación como

Servidor

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

Espero que esto te ayude a pensar de otra manera

 130
Author: code-jaff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-28 21:34:28

Para aquellos como @sha1 preguntándose por qué el código de la OP no funciona -

La lógica de OP para eliminar el reproductor en el lado del servidor está en el controlador para el evento DelPlayer , y el código que emite este evento (DelPlayer) está dentro de disconnected devolución de llamada de evento del cliente.

El código del lado del servidor que emite este evento disconnected está dentro del callback de evento disconnect que se dispara cuando el socket pierde la conexión. Dado que el socket ya perdió la conexión, disconnected evento no alcanza el cliente.


Accepted solution ejecuta la lógica en el evento disconnect en el lado del servidor, que se dispara cuando el socket se desconecta, por lo tanto funciona.

 12
Author: T J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-24 11:23:06
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);
  });

});
 0
Author: Alexander Mills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 00:47:19