2011-11-10 134 views
1

我的Java應用程序必須將消息(多線程)發送到套接字服務器。該應用程序可以每秒發送100-200條消息。Java Socket客戶端模式

我想知道哪個是更好的方法來做到這一點?

  1. 打開單個客戶端套接字並通過這一個套接字發送來自所有線程的消息。 缺點:在連接失敗時必須處理重新連接邏輯,重新連接時可能會丟失許多消息。線程安全,阻塞?
  2. 爲每個線程創建一個新的客戶端套接字連接,並在發送後關閉它。 缺點:即使關閉了套接字,端口也會一直等到TIME_WAIT時段。

哪一種更好的實用方法?

回答

3

我會建議3.: 每個線程打開一個套接字,並重用線程(例如通過線程池)。然後處理線程內的重新連接,或者恰當地處置它並創建一個新線程。這樣你可以避免阻塞和同步問題

+0

但操作系統正確嗎?它具有固定數量的端口(比如65000)並重新使用該池中的端口。我應該在微觀層面實施同樣的事情嗎? – Dunxton

+0

有OS打開消息套接字,所以最好保留和重用現有的一個(打開新的socked方式與服務器的TCP hanshaking) –

1

每秒100-200條消息沒有那麼多。我不會每次重新連接,因爲這是昂貴的。如果您重新使用連接,速度會更快。

如果您擔心丟失郵件,您可以一次發送一批郵件或一個郵件,並等待服務器收到確認。您仍然可以每秒以這種方式發送數千條消息。

+0

100-200個進程,每產生3個連接,所以實際上大約有600個套接字連接一秒鐘。那些NIO框架如apache MINA或Jboss netty呢?他們會幫忙嗎?我有點關心池,因爲我無法承受重新連接或線程等待/阻塞。它必須是我發送的實時數據。另外,我只能寫套接字客戶端。目的地不在我的控制下批量讀取數據。 – Dunxton

+0

每個連接發送一條消息肯定會非常低效。開銷比重新使用現有連接高出1000倍以上。這也給服務器帶來了巨大的負擔。如果你不小心,可能會導致資源耗盡。如果每次必須重新連接,您必須通過實驗來確定您可以執行此操作的限制,並將您的客戶共同限制爲此速率。你最好試圖說服誰管理服務器來修復它,或者至少警告他們他們需要告訴你是否關閉了服務器。 –