2011-10-13 35 views
0

我有一臺服務器和客戶機(1000),服務器每秒鐘進行通信。我正在爲每個客戶端在服務器上創建單個線程。客戶機/服務器套接字系統的更好的解決方案

我想知道什麼:

是否使用線程爲每一個客戶是一個好主意(創建線程,當他們的loggedIn成功地)或有另一種方式更有效地服務器和客戶機之間的通信?

服務器Java和使用C

在客戶端和服務器規格編程:

64位TwelveCore AMD CPU 2xAMD皓龍™6174,

2,2千兆赫DDR3-RAM雙128 GB ECC, REG。 (errorCorrected)

20 TB S-ATA II和6 TB SAS(熱插拔)硬盤

謝謝

回答

1

理論上你應該有針對每個客戶端的請求單獨的線程處理。 然而,實際上,這是不可能的,給有限的硬件資源的限制。限制硬件資源停止創建無限數量的線程併爲每個請求創建單獨的線程對於OS要管理這些線程所要執行的任務來說是一項代價高昂的操作。 要解決此問題,您應該考慮通過thread-pool來重新使用線程來爲不同的客戶端提供服務。如果您在服務器端使用Java,那麼concurrency Java包(從1.5開始)提供了創建和使用線程池的完整基礎結構。有關更多詳細信息,請參見http://download.oracle.com/javase/tutorial/essential/concurrency/pools.html

+0

謝謝你,我會得到有關包的詳細信息。 – Racooon

1

您可以使用非阻塞NIO來共享線程之間的連接。最小數爲1;)如果你想使用Dispacher模型,我建議使用一個庫來處理你的細節。例如網狀。

在測試中,我使用了10000個連接浪費了大約1個內核。如果你有1,000個,我預計你會浪費一個核心的10%。我的觀點是,雖然它的效率更高,但對您的應用程序進行支持可能不會有太大的改變。

+0

謝謝,我會嘗試使用NIO共享連接。 – Racooon

+0

查看http://www.jboss.org/netty/performance它具有支持在同一臺服務器上連接100,000個文檔。 –

1

我建議你看看Java NIO(新I/O),你可以使用它來使你的服務器單線程化(至少非常少的線程)。

這裏有一些很好的例子:

http://www.exampledepot.com/egs/java.nio/NbServerSocket.html 
http://www.exampledepot.com/egs/java.nio/AcceptSocket.html 
http://www.exampledepot.com/egs/java.nio/NbServer.html 
+0

感謝您的有用示例 – Racooon

相關問題