2011-07-03 15 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に私は統計が

open: 471 
closed: 235 
handshaken: 471 
closedA: 235 
次されているファイルの上限(256)を打ちます

私を困惑させるものは:

  • 私は強制的に接続を閉じると、これは私がクライアントのdisconnect()としたいのですが、なぜファイルハンドルを使用しているのですか?息を止めずファイルの上限に達することはありません)?
  • ソケットを完全に閉じる方法はありますか?ファイルの制限にはほとんど到達していません(私は65Kにプッシュできます)。
  • ファイル制限に達しているため、接続の受け入れを中止できる方法がありますか?

は、クライアントが他の方法で回避よりも、その後、接続を閉じ、サーバーに「終了」コマンドを送信した場合それは良いでしょうあなた

+0

(編集用に感謝) – Claudio

+2

がいる場合、クライアントでは、私は(500ミリ秒)を切断する前に、いくつかの遅延を追加し、サーバー自体を安定化し、最大ファイル制限が – Claudio

+0

グレート質問、クラウディオに達することはありません! p.s.もっと答えを受け入れてください。 ;) –

答えて

1

ありがとうございます。

サーバーは、接続を中止する前にタイムアウトまで常に待機します。たとえタイムアウトが小さくても、多数の接続が入ってきても、過負荷になります。 そのため、たとえば、アプリサーバーでキープアライブを無効にすることは常に有効です。

遅延は、新しいものを開く前に接続を閉じる時間があるために役立ちます。

+0

ああ、OK。そのため、クライアントが効率的に接続を閉じることができます。意味をなさない – Claudio

関連する問題