【发布时间】:2017-06-14 22:47:24
【问题描述】:
我有这个使用 socket.io (1.5) 的简单 node.js 服务器代码:
var io = require('socket.io').listen(8080);
io.on('connection', function(socket) {
console.log(' %s sockets connected', io.engine.clientsCount);
socket.on('disconnect', function() {
console.log("disconnect: ", socket.id);
});
});
如果我运行此代码并按 F5 几次,在某些情况下,会在旧连接断开之前创建新连接。一段时间后,我认为是心跳超时,所有连接都将关闭。查看结果:
2 sockets connected
3 sockets connected
4 sockets connected
5 sockets connected
6 sockets connected
7 sockets connected
8 sockets connected
9 sockets connected
10 sockets connected
11 sockets connected
disconnect: 0h_9pkbAaE3ftKT9AAAL
11 sockets connected
12 sockets connected
13 sockets connected
14 sockets connected
disconnect: oB4HQRCOY1UIvvZkAAAP
14 sockets connected
15 sockets connected
disconnect: LiIN0oDVoqbePgxFAAAR
15 sockets connected
16 sockets connected
17 sockets connected
18 sockets connected
disconnect: zxvk-uhWABHzmu1uAAAV
18 sockets connected
19 sockets connected
20 sockets connected
disconnect: FlboxgTzcjf6ScffAAAY
20 sockets connected
21 sockets connected
disconnect: 9UGXbnzukfGX_UtWAAAa
21 sockets connected
disconnect: pAfXOEz6RocKZdoZAAAb
21 sockets connected
disconnect: DIhTyVgG2LYBawaiAAAc
21 sockets connected
disconnect: W4XOc1iRymfTE2U0AAAd
21 sockets connected
disconnect: WZzegGPcoGDNLRTGAAAe
21 sockets connected
22 sockets connected
disconnect: KVR3-fYH0cz77BmgAAAC
disconnect: ANQknhnxr4l-OAuIAAAD
disconnect: KZE5orNx6u9MbOArAAAE
disconnect: TS6LL3asXrcznfcPAAAF
disconnect: SVNxS3I7KqecdqKhAAAG
disconnect: IE2WE5Y0PJzvxgBfAAAH
disconnect: v69bdJav9PjpThBGAAAI
disconnect: mJKT1ggfOOTshZKgAAAJ
disconnect: YlycVjdcWe0emCAcAAAK
disconnect: MoIDJSzP_L-1RUwuAAAM
disconnect: wAl0x5qwCkrnDDYQAAAN
disconnect: eiTlPEk2Hx_X-L-fAAAO
disconnect: KgkrXxzG_EpXOsPTAAAQ
disconnect: Lvf3kK-6XXEbu3NWAAAS
disconnect: -hOoGdYOIvVK04K_AAAT
disconnect: 3EUmaAYpK-U3Ss9tAAAU
disconnect: HQ6M98FebtKlU3OfAAAW
disconnect: OwgrbRBYbS4j84nmAAAX
disconnect: yN8FZAP4RjUNl2MeAAAZ
disconnect: K9IFTjlgAWzdNfpUAAAf
我的问题是: 这是 Bug 还是 socket.io 的正常行为?如何防止连接泛滥,只需按 F5?
最好的问候 马克
【问题讨论】:
-
刷新浏览器时浏览器应该关闭打开的 webSockets,然后你应该断开连接。如果不是,那将是一个浏览器错误。如果浏览器没有立即关闭 webSocket,socket.io 将看到套接字不再处于活动状态(因为心跳)并且套接字最终会被清理。
-
所有实际浏览器都会发生这种情况。
-
从您按 F5 到服务器最终断开连接之间的时间量是多少?您的计数似乎也有问题,因为您在断开连接时没有显示计数减少。
-
如果您只按 F5 一次,立即断开连接。但是,如果你按 F5 足够快,一些 disennects 就会“丢失”。我不认为计数器有错,因为示例服务器仅在新连接打开时才计数
-
我对计数器的评论是您收到了断开连接的消息,但计数并没有下降。这在您的日志记录中似乎很明显。如果只是快速刷新导致问题,我不知道你为什么担心这个问题。他们会在短时间内自行清理,因此不会意外长期积累任何东西。这会引起任何实际问题吗?您可以缩短 socket.io 不活动超时,以便它们更快地清理自己,但这可能会造成其他妥协,所以如果它实际上没有引起真正的问题,我不会改变。
标签: javascript node.js sockets socket.io