No puedo manejar este evento de desconexión, ¡no sé por qué el 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
javascript
socket.io
disconnect
Raggaer
fuente
fuente
'disconnect'
lugar de'disconnected'
?Respuestas:
De acuerdo, en lugar de identificar a los jugadores por pista de nombre con enchufes a través de los cuales se han conectado. Puedes 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.
fuente
allClients.splice(i, 1)
para eliminar un elemento.delete allClients[i]
establecerá la posición de la matriz enundefined
i
tiene un valor de -1 cada vez. ¿Puedes decirme qué está pasando?allClients
matriz). Te sugiero que regresesif (i === -1)return;
antes de intentar empalmarlo.Para aquellos como @ sha1 que se preguntan por qué el código del OP no funciona:
La lógica de OP para eliminar el jugador en el lado del servidor está en el controlador del
DelPlayer
evento, y el código que emite este evento (DelPlayer
) está en ladisconnected
devolución de llamada del evento interno del cliente.El código del lado del servidor que emite este
disconnected
evento está dentro de ladisconnect
devolución de llamada del evento que se activa cuando el socket pierde la conexión. Dado que el socket ya perdió la conexión, eldisconnected
evento no llega al cliente.La solución aceptada ejecuta la lógica del
disconnect
evento en el lado del servidor, que se activa cuando el socket se desconecta, por lo tanto, funciona.fuente
Cree un mapa o un conjunto, y usando el evento "en conexión" establecido en cada enchufe conectado, a la inversa, el evento "una vez desconectado" elimine ese enchufe del mapa que creamos anteriormente.
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); }); });
fuente
También puede, si lo desea, usar el ID de socket para administrar su lista de jugadores de esta manera.
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) }) })
fuente