2011-06-18 31 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; 
     } 

VAR的客戶=新的TcpClient(主機名, 端口號);

對於某些機器來說可能會非常緩慢。例如,在我的家庭網絡中,需要2到3秒鐘的時間。你能看出15個客戶端的真實情況嗎?

我想知道有多昂貴,或者甚至有可能每次都不關閉客戶端,並始終保持其中的30-40個端口?我假設一些機制來檢查,以確保他們活着,並確保他們都正確關閉需要編碼,但我想知道如果想法本身是正確的..

謝謝!

回答

1

沒有人應該保持或限制您一次創建多個客戶端/連接。實際上,啓動和關閉大量的連接可能會觸發不同的安全措施(試圖阻止可能的DDOS攻擊或其他)。您最好先加快解析主機名並緩存這些主機名的過程。它不一定是造成實際速度變慢的對象。

操作系統可能會限制每秒未決連接的數量(在Windows下認爲是每秒10個),但除此之外不應該有任何問題。在我看來,你不應該打開/關閉單個命令的連接。你應該考慮保持開放,TcpClient以及StreamWriter。只要確保在寫完數據包後進行刷新即可。爲了提高性能,您應該考慮手動刷新,尤其是當每個客戶端都有多個命令/數據包發送到每個客戶端時,因爲每個數據包將採用最小的TCP窗口大小(通常約爲1492-1500字節)。

+0

解析主機名是什麼意思?你的意思是獲取IP並使用它們? 所以,你說我想要做的是正確的方式? OPening和保持40左右的連接不會傷害?因爲是的,正如你所看到的,我正在每條命令中打開/關閉其中的40個。 – katit

+0

您是否有任何示例代碼需要保持/沖洗流?我所有的數據包都很小,現在低於1K。 – katit

+0

如果您的基礎設施,設計等支持,保持打開狀態完全正常。特別是與永久性重新連接相比。解析DNS名稱是獲取與特定主機名匹配的IP的過程(無論如何,這應該由操作系統緩存,但仍然可能會導致一些緩慢)。要保持流,只是不要關閉它,不要處理該對象。要衝洗,大部分(如果不是全部)流支持「Flush()」方法。 – Mario