Node.js Socket.io页面刷新多个连接

我有这个简单的node.js Servercode使用socket.io(1.5):

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几次,在某些情况下,新的连接被创build,旧的断开之前。 过了一段时间,我认为它的心跳Timout,所有的连接将被closures。 查看结果:

  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 

我的问题是:这是一个错误,或者这是socket.io的正常行为? 我怎样才能防止连接泛滥,简单地按下F5?

最好的问候马克

我做了我自己的testing应用程序,并能够弄清楚是怎么回事。

如果你多次打F5,它会在Chrome中暂时积累一些额外的socket.io连接,但是在相对较短的时间内(也就是几分钟),它会恢复,并且连接的套接字总数会回到1。

经过进一步testing,我发现这不是一个浏览器问题。 这是如何socket.io启动一个socket.io连接的问题。 如果你在客户端replace它:

 var socket = io(); 

有了这个:

 var socket = io({transports: ['websocket'], upgrade: false}); 

这迫使socket.io只使用一个webSocket而不使用HTTP轮询,然后问题消失。

所以,这个问题是因为s​​ocket.io的默认行为是从一个socket.io连接的http轮询版本开始的。 在交换了一些数据之后,socket.io将尝试切换到真实的webSocket。 如果这个真正的webSocket工作,那么它将停止使用http轮询连接。

但是,如果在轮询和真正的webSocket之间的转换过程中碰到F5,那么socket.io就不会有持久的连接,只能知道它正在与之通信的网页现在已经消失了。 所以,只能稍后找出来自该网页的传入通信,因此它应该清除它的socket.io连接(当您按F5时它处于轮询模式)。

但是,如果你closures了上面的客户端代码的初始轮询模式,那么它只使用一个真正的webSocket(从不使用模拟轮询模式),浏览器非常善于清理webSocket,当你点击F5时,服务器要么没有完成build立它的socket.io连接(在这种情况下,没有连接还没有被暂时孤立),或者它已经被转换为webSocket(并且浏览器将干净地closuresF5上的连接)。

因此,这是socket.io启动的http轮询模式的devise限制。由于在该模式下没有连续的连接,当该页面被F5replace时,浏览器没有立即通知,因此服务器具有没有办法知道客户刚刚失踪。 但是,如果跳过http轮询模式并从一个真正的webSocket开始,那么就没有这样的时间窗口,只有一个socket.io连接,而没有真正的webSocket,因此服务器总是被浏览器closureswebSocket当页面消失时连接。