2011-07-03 149 views
19

我想了解哪些是我的应用程序的“物理”限制。Socket.io:如何处理关闭连接?

在客户端:

var socket = io.connect("http://127.0.0.1:6701"); 
socket.on('connect', function() { 
    socket.disconnect(); 
}); 
socket.on('disconnect', function() { 
    socket.socket.reconnect(); 
}); 

在服务器端:

var io = require('socket.io').listen(6701); 

io.sockets.on('connection', function(socket) { 

    socket.on('disconnect', function(reason) { 
    var o = Object.keys(socket.manager.open).length 
     , c = Object.keys(socket.manager.closed).length 
     , cA = Object.keys(socket.manager.closedA).length 
     , h = Object.keys(socket.manager.handshaken).length 

     console.log("open: " + o) 
     console.log("closed: " + c) 
     console.log("handshaken: " + h) 
     console.log("closedA: " + cA) 
     console.log("---"); 
    }); 
}); 

当OSX我打的文件限制(256)的统计数据如下

open: 471 
closed: 235 
handshaken: 471 
closedA: 235 

令我困惑的是:

  • 如果我强制关闭连接(这是我想要做的客户端disconnect(),为什么我还在使用文件句柄(所以我达到了文件限制)编辑:添加延迟似乎服务器可以保持呼吸,永远不会达到文件限制)?
  • 有没有办法完全关闭套接字,所以我可以肯定文件限制很少达到(我知道我可以推到65K)?
  • 有没有办法知道我达到了文件限制,以便我可以停止接受连接?

谢谢

+0

(感谢您的编辑) – Claudio

+2

如果在客户端,我在断开连接之前增加了一些延迟(500ms),服务器自行稳定并且永远不会达到最大文件限制 – Claudio

+0

伟大的问题,Claudio!附:请接受更多答案。 ;) –

回答

1

它的更好,如果客户端发送一个“停止”命令,服务器,然后关闭连接,比周围的其他方法。

在放弃连接之前,服务器将一直等待到超时。即使这个超时时间很短,但有大量的连接进来,它会超载。 例如,这就是为什么在应用程序服务器上禁用保持活动状态总是很好的原因。

延迟会有帮助,因为服务器有时间在打开新连接之前关闭连接。

+0

噢,好的。因此,更多的客户可以有效地关闭连接。说得通。 – Claudio