2014-10-17 120 views
1

我有一個使用Java套接字的客戶端 - 服務器應用程序。到目前爲止,它的工作原理如下:Java:建立套接字連接池

客戶端打開到服務器的套接字連接。服務器的socketHandler線程將新套接字放到LinkedBlockingQueue上。 Worker線程從隊列中獲取一個套接字並從流中讀取一個對象(客戶端將對象發送到服務器)並將答案寫回客戶端並關閉套接字。

但現在我想創建一個連接池,以便連接可以保持打開,但我仍然想要LinkedBlockingQueud。

我的想法是,每個新的連接都放在一個隊列中,讓我們調用它openSocketQueue,然後socketHandler線程(或其他線程)遍歷openSocketQueue並檢查是否有新的數據可用(不讀取數據)。如果數據可用,則將該套接字從隊列中移除並放入LinkedBlockingQueue。工作完成後,套接字未關閉,但放回到openSocketQueue。

這是合理的嗎?我如何迭代套接字來檢查是否有新的數據以有效的方式被訪問?

順便說一句,我不能改變爲NIO,因爲我沒有時間。

+0

既然你想避免使用NIO的異步好處,這是唯一的選擇left.So你只想使用套接字。像netty,mina等其他軟件包也可以提供幫助。如果你想使用「反應堆設計模式」,那麼上述軟件包將有所幫助。否則,你將需要訴諸循環。 – 2014-10-17 10:30:54

+0

使用SO_REUSEADDR插座怎麼樣? – machinery 2014-10-17 11:31:45

+0

'SO_REUSEADDR'與這個問題沒有任何關係。 – EJP 2014-10-18 22:50:31

回答

2

你完全困惑。

在客戶端執行連接池而不是調用new Socket()您查看以目標IP:端口爲關鍵字的集合;而不是關閉你返回連接池;並添加一個線程來關閉池中已經存在很久的套接字,例如15秒。

在服務器上需要的所有東西都是每個連接的線程,它會循環讀取請求,直到EOS,如我們在您的other thread中所討論的。沒有這available()/LinkedBlockingQueue的東西。