Tengo algunos detectores de eventos conectados a un socket en el lado del servidor. Cuando el cliente conectado a ese socket se desconecta (en la actualización de la página, por ejemplo), se vuelve a conectar con un nuevo socket en el lado del servidor diferente al que estaba usando antes de desconectarse. Por lo tanto, todos los detectores de eventos conectados al socket antiguo se pierden. ¿Hay alguna manera de mantener a los oyentes de eventos incluso después de la reconexión? Gracias !
Cliente :
socket.on('connect', () => { // Do some stuff });servidor :
io.on('connection', (socket) => { const CUSTOM_EVENT = 'CustomEvent'; onTimeRunFunctionThatAttachesListnerToAnEvent(socket, CUSTOM_EVENT); console.log(`Client connected to socket id '${socket.id}'`); console.log(`Nb of listners to event ${CUSTOM_EVENT} : ${socket.listenerCount(CUSTOM_EVENT)}`); socket.on('disconnect', (reason) => { console.log('client disconnected'); }); });Registros
Client connected to socket id '9FKJ152mdOLaHcC2AAAB' Nb of listers to event 'CustomEvent' = 1 client disconnected Client connected to socket id 'ulqq3yvjQflXLyHTAAAF' Nb of listers to event 'CustomEvent' = 0Socket io vuelve a conectar automáticamente a todos los que han establecido una conexión.
Nunca debe crear rutinas que supongan que sus clientes tendrán el mismo socket.id a lo largo de su sesión, incluso si no se producen actualizaciones, el servidor de socket puede perder la conexión y volver a crear uno nuevo.
Aquí puedes leer mejor al respecto
cómo manejar la recarga de la página en las aplicaciones de chat del cliente socket.io
Intenté almacenar oyentes en un objeto global usando clientID cuando el socket se está desconectando y cuando el cliente con el mismo clientID se vuelve a conectar usando un nuevo socket, restauro los oyentes de eventos. Esto parece resolver mi caso.
Servidor
let playersEventListeners = {}; io.on('connection', (socket) => { console.log(`Client connected to socket id '${socket.id}'`); const CUSTOM_EVENT = 'CustomEvent'; if (socket.handshake.auth.clientID in playersEventListeners) { console.log('overriding event listeners'); for (let listener of playersEventListeners[socket.handshake.auth.clientID]){ socket.addListener(CUSTOM_EVENT , listener); } console.log(`Nb of listners to event ${CUSTOM_EVENT} : ${socket.listenerCount(CUSTOM_EVENT)}`); } oneTimeRunFunctionThatAttachesListnerToAnEvent(socket, CUSTOM_EVENT); socket.on('disconnecting', (reason) => { console.log('client disconnecting'); console.log(`Nb of listners to event ${CUSTOM_EVENT} : ${socket.listenerCount(CUSTOM_EVENT)}`); // Store socket event listeners before disconnecting playersEventListeners[socket.handshake.auth.clientID] = socket.listeners(CUSTOM_EVENT); }); socket.on('disconnect', (reason) => { console.log('client disconnected'); }); });Registros
Client connected to socket id '9FKJ152mdOLaHcC2AAAB' client disconnecting Nb of listers to event 'CustomEvent' = 1 client disconnected Client connected to socket id 'ulqq3yvjQflXLyHTAAAF' overriding event listeners Nb of listers to event 'CustomEvent' = 1