Socket.io: Отправка старых подключений при обновлении браузера и сохранение старых подключений

Созданный на 1 февр. 2016  ·  4Комментарии  ·  Источник: socketio/socket.io

Привет,

У меня есть простая тестовая установка сервера 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

Даже по прошествии многих часов и без подключенных клиентов (браузеров) старые соединения все еще передаются.

Самый полезный комментарий

@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), когда сокет отключается.

Все 4 Комментарий

Вам нужно очистить интервал при отключении с помощью 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();
  });

});

Спасибо, что нашли время ответить, это действительно направило меня в правильном направлении.

Ваше здоровье.

Рад помочь!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги