103 votes

Traitement de l'événement de déconnexion par Socket.IO

Impossible de 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 se déconnecte, l'objet Array [person_name] devrait être supprimé, mais il ne l'est pas.

193voto

code-jaff Points 3294

Ok, au lieu d'identifier les joueurs par leur nom, suivez les prises par lesquelles 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.

28voto

T J Points 9851

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

La logique de l'OP pour effacer un joueur du côté serveur est dans le gestionnaire de la fonction DelPlayer événement, et le code qui émet cet événement ( DelPlayer ) est à l'intérieur disconnected le rappel d'événement du client.

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


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

8voto

Alex Mills Points 635

Créez une carte ou un ensemble et, à l'aide de l'événement "on connection", affectez-y chaque socket connecté, à l'inverse, l'événement "once disconnect" supprime ce socket de la carte que nous avons 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);
  });

});

1voto

Final12345 Points 11

Vous pouvez également, si vous le souhaitez, utiliser le socket id pour gérer votre liste de joueurs comme ceci.

io.on('connection', function(socket){
  socket.on('disconnect', function() {
    console.log("disconnect")
    for(var i = 0; i < onlineplayers.length; i++ ){
      if(onlineplayers[i].socket === socket.id){
        console.log(onlineplayers[i].code + " just disconnected")
        onlineplayers.splice(i, 1)
      }
    }
    io.emit('players', onlineplayers)
  })

  socket.on('lobby_join', function(player) {
    if(player.available === false) return
    var exists = false
    for(var i = 0; i < onlineplayers.length; i++ ){
      if(onlineplayers[i].code === player.code){
        exists = true
      }
    }
    if(exists === false){
      onlineplayers.push({
        code: player.code,
        socket:socket.id
      })
    }
    io.emit('players', onlineplayers)
  })

  socket.on('lobby_leave', function(player) {
    var exists = false
    for(var i = 0; i < onlineplayers.length; i++ ){
      if(onlineplayers[i].code === player.code){
        onlineplayers.splice(i, 1)
      }
    }
    io.emit('players', onlineplayers)
  })
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X