2011-06-18 5 views
2

私は、クライアントピアがTCP-IP経由で互いに通信するプログラムを持っています。あるクライアントが何かをすると、彼は他のクライアントにこれが起こったことを一つずつ伝えます。ここで私は全体のデータを送信するために使用したコードです:TcpClientの作成が非常に遅いようです。それらをキャッシュすることはできますか?

public static string SendDirect(string data, string hostName, int portNumber) 
     { 
      string responseData; 

      try 
      { 
       var client = new TcpClient(hostName, portNumber); 

       Stream s = client.GetStream(); 
       var sw = new StreamWriter(s) { AutoFlush = true }; 

       sw.WriteLine(data); 

       s.Close(); 
       client.Close(); 

       s.Dispose(); 
       sw.Dispose(); 

       responseData = "OK"; 
      } 
      catch (SocketException ex) 
      { 
       responseData = ex.Message; 
      } 

      return responseData; 
     } 

ライン=新しいれるtcpClient(ホスト名、 のportNumber)

のvarクライアントは、

いくつかのマシンでは非常に遅くなることがあります。たとえば、私のホームネットワークでは2〜3秒かかります。 15人のクライアントで本当に悪いことが分かりますか?

いつもクライアントを閉じずに、30〜40人を常時開いておくことができれば、どれくらいの費用がかかりそうですか?私は彼らが生きていることを確認するためのチェックメカニズムと仮定し、すべてが正しく閉じられていることを確認するために、アイデア自体が正しいかどうか疑問に思う。

ありがとう!

答えて

1

一度に複数のクライアント/接続を作成しないようにする必要はありません。実際にトン数の接続を開始したり閉じたりすることで、さまざまなセキュリティの問題が引き起こされる可能性があります(DDOS攻撃の可能性を排除しようとするなど)。ホスト名を解決してキャッシュするプロセスを高速化することもできます。実際にあなたを遅くするオブジェクト作成である必要はありません。

OSは、1秒間に保留中の接続数を抑制することがありますが(Windowsでは毎秒10秒と考える)、問題はないはずです。とにかく私の意見では、あなたは単一のコマンドのための接続を開いたり閉じるべきではありません。両方を開いたままにしておくことを考えてください。TcpClientStreamWriter。あなたのパケットを書き終えたら一度フラッシュしてください。パフォーマンスを向上させるには、手動でフラッシングすることを検討する必要があります。特に、各パケットが最小TCPウィンドウサイズ(通常は1492-1500バイト程度)を取るため、各クライアントに複数のコマンド/パケットが送信される場合があります。

+0

ホスト名を解決することはどういう意味ですか?知的財産権を取得して使用することを意味しますか? 私はしたいことが適切な方法だと言っていますか? 40以上の接続を開いて維持することは傷つきませんか?はい、現在のところ、表示されているように、私は各コ​​マンドで40個を開閉しています。 – katit

+0

ストリームを維持/フラッシュする際のサンプルコードは手元にありますか?すべての私のパケットは今、1k以下の非常に小さい。 – katit

+0

あなたのインフラストラクチャ、デザインなどでサポートされていれば、それらを開いたままにしておくとよいでしょう。特に永続的な再接続と比較して。 DNS名の解決は、特定のホスト名に一致するIPを取得するプロセスです(これは、OSによってキャッシュされる必要がありますが、それでもやはり速度低下を引き起こす可能性があります)。ストリームを保持するには、ストリームを閉じずにオブジェクトを破棄してください。フラッシュするために、大部分ではないにしても、ほとんどの場合、 'Flush()'メソッドをサポートしています。 – Mario

関連する問題