2011-09-14 153 views
3

在我們的新項目中,我們需要實現一個服務器應用程序。該服務器獲得50,000(+)個客戶端的連接請求。問題是這些連接必須保持開放並且必須在某處進行管理。應用程序應該像電話交換機一樣工作。所以它可以獲得連接客戶端的請求,並且只有在它們也連接時纔將它們連接到其他(可能是幾個)客戶端。使用專有協議。我的問題是:在java服務器應用程序中管理多個套接字連接

如何(以及在​​哪裏)管理打開的套接字?我應該把它們放在HashMap中嗎?這聽起來對我很好奇。但我沒有這麼多開放連接的經驗。

是否有任何支持此連接要求的框架?

謝謝你的幫助!

+0

我認爲Netty(http://www.jboss.org/netty)是您的最佳選擇。 – bravit

回答

6

如何(以及在​​哪裏)管理打開的套接字?我應該把它們放在HashMap中嗎?

典型情況下,每個套接字將由負責讀取和寫入套接字的線程管理。您還有一個主線程,負責在預定義的網絡接口(使用API​​類的ServerSocket)接收所有連接請求,然後可以將實際處理工作交給工作/從屬線程。在這種情況下,你應該爲工作線程尋找一個線程池,因爲創建50k線程很可能會壓倒你的操作系統和硬件。另外,如果您確實在管理50k個併發套接字,則強烈建議在Java的普通IO API上使用NIO API(java.nio。*),儘管我沒有看到太多項目需要超過2個以上的套接字5k併發連接。在Java世界中有至少兩種已知的基於NIO的框架 - Apache MINAJBoss Netty。不過,在推薦使用NIO API或NIO框架之前,我建議您閱讀well written NIO tutorial

+1

寫得很好。爲了增加你所說的話,服務器套接字就像打開的文件句柄一樣,每個OS作爲當前同時打開的套接字數量的限制。從頭開始處理這個和其他資源管理將是一個巨大的痛苦。這就是爲什麼像Apache MINA和JBoss Netty這樣的項目誕生的原因。 – Santosh

+1

@Santosh,是的,關於開放文件句柄(以及網絡帶寬)的部分是爲什麼50k併發套接字很難實現。 [這個Netty基準](http://www.jboss.org/dms/netty/performance/20081006-tlee/performance.pdf)演示了使任何框架飽和1Gb以太網鏈路是多麼容易;一個盒子必須有幾個千兆以太網鏈路才能獲得50k併發連接。 –

相關問題