你好,
我有一个简单的 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
即使经过几个小时并且没有连接的客户端(浏览器),旧的连接仍然被发送到。
您需要使用 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)。