所以基本上在标题中描述了该问题。 服务器工作在以下方式: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