web-dev-qa-db-fra.com

Socket.IO traitant l'événement de déconnexion

Je ne peux pas gérer cet événement de déconnexion, je ne sais pas pourquoi le socket n’est pas envoyé au client/le client ne répond pas!

Serveur

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

        });

    });

Comme vous pouvez le voir lorsqu'un client déconnecte l'objet Array [nom_personne] doit être supprimé, mais ce n'est pas le cas.

74
Raggaer

Ok, au lieu d’identifier les joueurs par leur nom, faites un suivi avec les sockets par lesquels ils se sont connectés. Vous pouvez avoir une implémentation comme

Serveur

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

J'espère que cela vous aidera à penser d'une autre manière

150
code-jaff

Pour ceux comme @ sha1, se demander pourquoi le code de l'OP ne fonctionne pas -

La logique d'OP pour supprimer le lecteur côté serveur se trouve dans le gestionnaire de l'événement DelPlayer, et le code qui émet cet événement (DelPlayer) se trouve dans le rappel de l'événement disconnected du client.

Le code côté serveur qui émet cet événement disconnected se trouve à l'intérieur du rappel d'événement disconnect qui est déclenché lorsque le socket perd la connexion. Comme le socket a déjà perdu la connexion, l'événement disconnected n'atteint pas le client.


La solution acceptée exécute la logique sur l'événement disconnect côté serveur, qui est déclenché lorsque le socket se déconnecte, fonctionne donc.

15
T J

Créez une carte ou un ensemble, et en utilisant l'événement "on connection" défini pour chaque socket connecté, en sens inverse "une fois la déconnexion", supprimez ce socket de la carte créée précédemment

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

});
3
Alexander Mills