javascript - rooms - socket.io server
Socket.IO manejando el evento de desconexión (3)
¡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] se debe eliminar, pero no
Ok, en lugar de identificar a los jugadores por su nombre, con sockets 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.
Para aquellos como @sha1 que se preguntan por qué el código del OP no funciona -
La lógica de OP para eliminar el reproductor en el lado del servidor está en el controlador para el evento DelPlayer
, y el código que emite este evento ( DelPlayer
) se encuentra dentro de la devolución de llamada de evento disconnected
del cliente.
El código del lado del servidor que emite este evento disconnected
está dentro de la devolución de llamada del evento de disconnect
que se activa cuando el socket pierde la conexión. Como el socket ya perdió la conexión, el evento disconnected
no llega al cliente.
La solución aceptada ejecuta la lógica en el evento de disconnect
en el lado del servidor, que se activa cuando se desconecta el zócalo, por lo tanto, funciona.
import * as Server from ''socket.io'';
const io = Server();
io.listen(3000);
export const connections = new Map();
io.on(''connection'', function (c) {
connections.set(c, c);
c.once(''disconnect'', function () {
connections.delete(c);
});
});