Привет,
У меня есть простая тестовая установка сервера socket.io, которая отправляет текущую дату() одному клиенту.
Каждую 1 секунду сервер отправляет (испускает) Date() одному клиенту.
Если я обновляю окно браузера, у меня все еще есть одно соединение, но сервер передает два соединения.
Если я обновляю окно браузера, у меня все еще есть одно соединение, но сервер выдает три соединения.
Если я обновлю окно браузера, у меня все еще есть одно соединение, но сервер выдает четыре соединения.
И так далее, и так далее...
Даже по прошествии нескольких часов отключенные клиенты все еще отправляются сервером.
Я ожидал, что сервер сбросит/закроет старые соединения без подключенного клиента.
Это ожидаемое поведение?
Я использую Socket.io v1.4.5 с Node v5.4.1.
Вот пример кода:
io.on('connection', function (socket) {
// console.log(socket.connected);
console.log('===================');
setInterval(() => {
console.log(socket.conn.id);
socket.emit('data', { ts: new Date() });
}, 1000);
});
Вот вывод console.log, когда я обновляю браузер каждые 2 секунды.
Вы можете увидеть socket.conn.id для каждого обновления браузера.
❯ 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
Даже по прошествии многих часов и без подключенных клиентов (браузеров) старые соединения все еще передаются.
Вам нужно очистить интервал при отключении с помощью clearInterval.
var oneSecondInterval = setInterval(() => {
console.log(socket.conn.id);
socket.emit('data', { ts: new Date() });
}, 1000);
socket.on('disconnect', function(){
clearInterval(oneSecondInterval);
});
Это должно помешать ему удерживать старые соединения.
@StevenBock Ах, хорошо .. да, все хорошо - спасибо!
У меня такая же проблема с другим примером.
Я хотел бы сохранить файл и отправить клиенту каждую новую строку.
Используя модуль npm 'tail', этот код работает нормально, но имеет проблему со старыми соединениями:
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() });
});
});
Каким-то образом мне нужно избавиться от хвостового события (tailTmpFile.on), когда сокет отключается.
@StevenBock Хорошо, отлично, понял.
Этот код удаляет прослушиватель событий при отключении.
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();
});
});
Спасибо, что нашли время ответить, это действительно направило меня в правильном направлении.
Ваше здоровье.
Рад помочь!
Самый полезный комментарий
@StevenBock Ах, хорошо .. да, все хорошо - спасибо!
У меня такая же проблема с другим примером.
Я хотел бы сохранить файл и отправить клиенту каждую новую строку.
Используя модуль npm 'tail', этот код работает нормально, но имеет проблему со старыми соединениями:
Каким-то образом мне нужно избавиться от хвостового события (tailTmpFile.on), когда сокет отключается.