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 / 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
javascript
socket.io
disconnect
Raggaer
la source
la source
'disconnect'
au lieu de'disconnected'
?Réponses:
Ok, au lieu d'identifier les joueurs par nom de piste avec des 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
la source
allClients.splice(i, 1)
supprimer un élément.delete allClients[i]
va juste définir la position du tableau surundefined
i
a une valeur de -1 à chaque fois. Pouvez-vous me dire ce qui se passe.allClients
tableau). Je vous suggère de revenir:if (i === -1)return;
avant d'essayer de le coller.Pour ceux comme @ sha1 se demandant pourquoi le code de l'OP ne fonctionne pas -
La logique d'OP pour supprimer le joueur côté serveur est dans le gestionnaire d'
DelPlayer
événement, et le code qui émet cet événement (DelPlayer
) se trouve dans ledisconnected
rappel d'événement interne du client.Le code côté serveur qui émet cet
disconnected
événement se trouve à l'intérieur dudisconnect
rappel d'événement qui est déclenché lorsque le socket perd la connexion. Puisque le socket a déjà perdu la connexion, l'disconnected
événement n'atteint pas le client.La solution acceptée exécute la logique sur l'
disconnect
événement côté serveur, qui est déclenché lorsque le socket se déconnecte, fonctionne donc.la source
Créez une carte ou un ensemble, et en utilisant l'événement "on connection" défini pour chaque socket connecté, en sens inverse l'événement "once disconnect" supprimez 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); }); });
la source
Vous pouvez également, si vous le souhaitez, utiliser socket id pour gérer votre liste de joueurs de cette manière.
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) }) })
la source