2013-04-30 21 views
0

我已經用C#編寫了一個TCP客戶端,具有讀寫功能,並且在命令行程序中的所有單線程上都按預期工作。TCP客戶端是4個連接,效率高於1?

TCP服務器每個用戶/ IP地址最多支持4個連接,並且我被告知最好使用4個線程中的全部4個連接來改進和優化性能。這是因爲我編寫的軟件性能至關重要,運行間隔僅爲100毫秒。

這是正確的嗎?我應該使用全部四個連接嗎?如果是這樣,使用單個TCP客戶端來解決這個問題的最佳方法是什麼?

編輯:對不起,我的意思是對tcp服務器的寫/讀操作每100毫秒發生一次。實際的響應顯然要快得多,毫秒或更少。

提前許多感謝, 戴夫

+0

有了一個體面的網絡連接,100ms是今天的現代硬件上的幾十年:) – 2013-04-30 09:06:47

+0

對不起,我的意思是每100毫秒對tcp服務器進行寫/讀操作。實際的響應顯然要快得多,毫秒或更少。 – Daveo 2013-04-30 09:08:41

回答

1

大部分的答案取決於硬件和客戶端和服務器的特定條件 - 如果服務器是單核系統上,只有在串行無論如何處理請求那麼你將看不到任何好處。然而,如果它是一個四核服務器,並且每個服務器插槽都卸載到一個單獨的核心中,那麼您將看到好處,因爲每個請求都可以並行處理(假設每個服務器連接並不是爲服務器上的共享資源而奮鬥它確實)。

至於最好的方法,這也有點取決於你在做什麼 - 如果你有一個場景,每個客戶端得到一個結果,它寫入一些共享資源,你將不得不確保你正確處理這個,for例如,通過創建圍繞寫入共享資源的代碼鎖:

object lock = new object(); 

lock(lock) 
{ 
    // write to the shared resource 
} 

如果每個客戶端執行它自己獨立的事情,沒有訪問共享資源,那麼你有沒有共享的資源需要保護。

您可以簡單地創建客戶端類的新實例並在執行時針對它執行一些函數,如果需要傳遞參數(此處我們將整數i作爲參數傳遞給TestClient類的運行函數這樣client.Run(i)中對4個獨立的客戶端類都在單獨的線程)執行:

for (int i = 0; i < 4; i++) 
{ 
    TestClient client = new TestClient(); 
    Thread thread = new Thread(new ParameterizedThreadStart(client.Run)); 
    thread.Start(i); 
} 

如果您TestClient.Run(int i)以類方法,那麼就建立連接,並進行呼叫,然後做任何它需要做的任何反應,那麼這應該工作得很好。

希望這會有所幫助。

+0

非常感謝。這似乎是現貨。我忘了提到的一點是,tcp服務器每天只允許最大數量的查詢,假設這是432,000,因此每秒請求5個請求。你將如何處理與4個客戶並行運行的客戶?目前只有一個線程它睡覺,但如果我有4個,我可以看到重疊的問題? – Daveo 2013-04-30 12:57:12

+0

我不確定我是否完全理解限制的影響,但有多種選擇,如果它們不必均勻分佈,那麼您可以將數字分割爲4,並針對每個客戶端計數器它每次打電話時都會增加,並持續呼叫,直至達到該上限。如果你需要它們傳播每秒5個請求,你可以讓每個線程每4秒打5個呼叫(在所有線程中平均每秒5個呼叫),但這不會是一個完美的傳播。可能值得爲這部分創建另一個問題並擴展它。 – Xefan 2013-04-30 13:20:11