所以基本上在標題中描述了該問題。 服務器工作在以下方式:Java多線程套接字服務器在獲得約50個同時連接後掛起連接
- 監聽到一個新的連接
- 一旦連接請求 - 將請求發送到Q,
- 繼續偵聽新的連接
- 獨立的過程需要關心Q併產生一個新線索來處理客戶的要求。
服務器代碼類似於this tutorial(一切都在try/catch語句,遺憾的是我不能顯示源代碼 - 公司政策)
這似乎很好地工作,直到客戶端的數量超過〜50,然後掛起,沒有例外/警告/等等。有一個32k的cpu線程限制,對打開的文件/打開的套接字/等的數量沒有限制。OS = CentOS 5.5(同樣的情況發生在ubuntu tho )。服務器使用ODBC將數據記錄到MySQL。單獨的壓力測試表明,我可以有多達32k的java進程(受/ proc/sys/kernel/threads-max限制),MySQL可以執行高達20k次的簡單操作/秒,所以我假設問題出在插槽。
所以,真正的問題是:
- 什麼是套接字連接的限制因素,我怎麼可以把它做大?
- 或者我看錯了地方?
嗨,那你的意思,當你說:「其實它與java.io.DataInputStream中的一個問題.readByte() - 它得到一個意想不到的EOF並掛起然後「 - 你能顯示出問題是什麼以及你做了什麼來解決它? – phobus 2011-03-17 09:13:10
@phobus嗨,問題是客戶端停止發送它要發送的字符串(連接問題/延遲等),服務器正在等待字符串的其餘部分(直到找到定義的EOF)才能執行某些操作。我沒有修復它,我寧願修改它,所以它只會讀取它找到的內容,例如: `int available = streamIn.available(); while(available> 0) \t { \t \t byte cr = streamIn.readByte(); \t \t如果(CR == EOF) \t \t { \t \t \t中斷; \t \t} \t \t myString + =(char)cr; \t \t可用 - ; \t}` – Sigtran 2011-03-18 11:15:31
對不起,它在評論部分看起來不太好,但它的可讀性好,我希望你明白。 – Sigtran 2011-03-18 11:18:59