Socket.io: 在浏览器刷新时发送到旧连接并保留旧连接

创建于 2016-02-01  ·  4评论  ·  资料来源: socketio/socket.io

你好,

我有一个简单的 socket.io 服务器测试设置,它将当前 Date() 发送到单个客户端。

服务器每 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);

});

这是我每 2 秒刷新一次浏览器时的 console.log 输出。

您可以看到每个浏览器刷新的 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 等级