我有一個使用Java套接字的客戶端 - 服務器應用程序。到目前爲止,它的工作原理如下:Java:建立套接字連接池
客戶端打開到服務器的套接字連接。服務器的socketHandler線程將新套接字放到LinkedBlockingQueue上。 Worker線程從隊列中獲取一個套接字並從流中讀取一個對象(客戶端將對象發送到服務器)並將答案寫回客戶端並關閉套接字。
但現在我想創建一個連接池,以便連接可以保持打開,但我仍然想要LinkedBlockingQueud。
我的想法是,每個新的連接都放在一個隊列中,讓我們調用它openSocketQueue,然後socketHandler線程(或其他線程)遍歷openSocketQueue並檢查是否有新的數據可用(不讀取數據)。如果數據可用,則將該套接字從隊列中移除並放入LinkedBlockingQueue。工作完成後,套接字未關閉,但放回到openSocketQueue。
這是合理的嗎?我如何迭代套接字來檢查是否有新的數據以有效的方式被訪問?
順便說一句,我不能改變爲NIO,因爲我沒有時間。
既然你想避免使用NIO的異步好處,這是唯一的選擇left.So你只想使用套接字。像netty,mina等其他軟件包也可以提供幫助。如果你想使用「反應堆設計模式」,那麼上述軟件包將有所幫助。否則,你將需要訴諸循環。 – 2014-10-17 10:30:54
使用SO_REUSEADDR插座怎麼樣? – machinery 2014-10-17 11:31:45
'SO_REUSEADDR'與這個問題沒有任何關係。 – EJP 2014-10-18 22:50:31