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