Socket.io: Emitir a conexiones antiguas al actualizar el navegador y retener conexiones antiguas

Creado en 1 feb. 2016  ·  4Comentarios  ·  Fuente: socketio/socket.io

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.

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:

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.

Todos 4 comentarios

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!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

doughsay picture doughsay  ·  4Comentarios

Aweather picture Aweather  ·  4Comentarios

MyMomSaysIAmSpecial picture MyMomSaysIAmSpecial  ·  4Comentarios

renkei picture renkei  ·  4Comentarios

karmac2015 picture karmac2015  ·  3Comentarios