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