tutorial socket rooms node example javascript socket.io disconnect

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