Hola,
Tengo una configuración de prueba de servidor socket.io simple que envía la Fecha actual () a un solo cliente.
Cada 1 segundo, el servidor envía (emite) la fecha () a un cliente.
Si actualizo la ventana del navegador, todavía tengo una conexión pero el servidor emite a dos conexiones.
Si actualizo la ventana del navegador, todavía tengo una conexión pero el servidor emite a tres conexiones.
Si actualizo la ventana del navegador, todavía tengo una conexión pero el servidor emite cuatro conexiones.
Y así sucesivamente y así sucesivamente...
Incluso después de varias horas, el servidor sigue emitiendo a los clientes desconectados.
Esperaba que el servidor dejara/cerrara las conexiones antiguas sin un cliente conectado.
¿Es este el comportamiento esperado?
Estoy usando Socket.io v1.4.5 con Node v5.4.1
Aquí hay una muestra de código:
io.on('connection', function (socket) {
// console.log(socket.connected);
console.log('===================');
setInterval(() => {
console.log(socket.conn.id);
socket.emit('data', { ts: new Date() });
}, 1000);
});
Aquí está la salida de console.log cuando actualizo el navegador cada 2 segundos.
Puede ver el socket.conn.id para cada actualización del navegador que se está emitiendo.
❯ node app.js ⏎
===================
kkizbfn-82gNOsyAAAAA
kkizbfn-82gNOsyAAAAA
===================
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
===================
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
===================
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
_GmZXIXg8VgUrdKlAAAD
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
_GmZXIXg8VgUrdKlAAAD
Incluso después de muchas horas sin clientes conectados (navegadores), las conexiones antiguas aún se están emitiendo.
Debe borrar el intervalo al desconectarse con clearInterval.
var oneSecondInterval = setInterval(() => {
console.log(socket.conn.id);
socket.emit('data', { ts: new Date() });
}, 1000);
socket.on('disconnect', function(){
clearInterval(oneSecondInterval);
});
Esto debería evitar que se aferre a las conexiones anteriores.
@StevenBock Ah, está bien... sí, todo bien, ¡gracias!
Tengo el mismo problema con este otro ejemplo.
Me gustaría seguir un archivo y enviar cada nueva línea al cliente.
Usando el módulo npm 'tail', este código funciona bien, pero tiene ese problema de aferrarse a las conexiones antiguas:
const io = require('socket.io')(8080);
const Tail = require('tail').Tail;
const tailTmpFile = new Tail("./tmp.txt");
io.on('connection', function (socket) {
console.log(socket.conn.id);
tailTmpFile.on("line", function (data) {
console.log('emitting Yes: ', socket.conn.id);
socket.emit('file', { data: data, ts: Date() });
});
});
De alguna manera, necesito eliminar el evento de cola (tailTmpFile.on) cuando el zócalo se desconecta.
@StevenBock Bien, genial, lo tengo.
Este código elimina el detector de eventos al desconectarse.
io.on('connection', function (socket) {
console.log(socket.conn.id);
var emitLine = function () {
var callback = function (data) {
socket.emit('file', { data: data, ts: Date() });
}
tailTmpFile.on("line", callback);
// dispose function
return function() {
tailTmpFile.removeListener('line', callback);
}
}();
socket.on('disconnect', function () {
// dispose tail file listener
emitLine();
});
});
Gracias por tomarse el tiempo para responder, realmente me puso en la dirección correcta.
Salud.
¡Encantado de ayudar!
Comentario más útil
@StevenBock Ah, está bien... sí, todo bien, ¡gracias!
Tengo el mismo problema con este otro ejemplo.
Me gustaría seguir un archivo y enviar cada nueva línea al cliente.
Usando el módulo npm 'tail', este código funciona bien, pero tiene ese problema de aferrarse a las conexiones antiguas:
De alguna manera, necesito eliminar el evento de cola (tailTmpFile.on) cuando el zócalo se desconecta.