2011-07-03 87 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