Socket.io: Emitindo para conexões antigas na atualização do navegador e retendo conexões antigas

Criado em 1 fev. 2016  ·  4Comentários  ·  Fonte: socketio/socket.io

Oi,

Eu tenho uma configuração de teste de servidor socket.io simples que está enviando o Date() atual para um único cliente.

A cada 1 segundo o servidor envia (emite) o Date() para um cliente.

Se eu atualizar a janela do navegador, ainda tenho uma conexão, mas o servidor emite para duas conexões.

Se eu atualizar a janela do navegador, ainda tenho uma conexão, mas o servidor emite para três conexões.

Se eu atualizar a janela do navegador, ainda tenho uma conexão, mas o servidor emite para quatro conexões.

E assim por diante e assim por diante...

Mesmo após várias horas, os clientes desconectados ainda estão sendo emitidos pelo servidor.

Eu esperava que o servidor descartasse/fechasse as conexões antigas sem um cliente conectado.

Esse é o comportamento esperado?

Estou usando o Socket.io v1.4.5 com o Node v5.4.1

Aqui está um exemplo 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);

});

Aqui está a saída do console.log quando atualizo o navegador a cada 2 segundos.

Você pode ver o socket.conn.id para cada atualização do navegador que está sendo emitida.

❯ 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

Mesmo depois de muitas horas e sem clientes conectados (navegadores), as conexões antigas ainda estão sendo emitidas.

Comentários muito úteis

@StevenBock Ah OK .. sim, tudo bem - obrigado!

Eu tenho o mesmo problema com este outro exemplo.

Eu gostaria de seguir um arquivo e enviar cada nova linha para o cliente.

Usando o módulo npm 'tail', este código funciona bem, mas tem esse problema de conexões antigas:

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 alguma forma, preciso descartar o evento de cauda (tailTmpFile.on) quando o soquete desconecta.

Todos 4 comentários

Você precisa limpar o intervalo na desconexão com clearInterval.

var oneSecondInterval = setInterval(() => {
    console.log(socket.conn.id);
    socket.emit('data', { ts: new Date() });
  }, 1000);

socket.on('disconnect', function(){
    clearInterval(oneSecondInterval);
});

Isso deve impedi-lo de manter as conexões antigas.

@StevenBock Ah OK .. sim, tudo bem - obrigado!

Eu tenho o mesmo problema com este outro exemplo.

Eu gostaria de seguir um arquivo e enviar cada nova linha para o cliente.

Usando o módulo npm 'tail', este código funciona bem, mas tem esse problema de conexões antigas:

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 alguma forma, preciso descartar o evento de cauda (tailTmpFile.on) quando o soquete desconecta.

@StevenBock OK ótimo - entendi.

Este código remove o ouvinte de eventos na desconexão.

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

});

Obrigado gentilmente por tomar o tempo para responder, isso realmente me colocou na direção certa.

Felicidades.

Feliz em ajudar!

Esta página foi útil?
0 / 5 - 0 avaliações