Socket.io:如何处理关闭连接?

时间:2011-07-03 10:38:21

标签: macos node.js 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)?
  • 有没有办法知道我达到了文件限制,以便我可以停止接受连接?

谢谢

1 个答案:

答案 0 :(得分:1)

最好是客户端向服务器发送“终止”命令然后关闭连接,而不是相反。

在放弃连接之前,服务器将一直等到超时。即使超时很小,但是有大量连接进入,它也会超载。 例如,这就是为什么在app服务器上禁用keep-alive总是好的。

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