用java 开发一个服务端,最多能同时连接多少个socket。我只用nio技术来实现服务端,可惜我能力有限,只实现二百多个就会报错。测试用的客户端,会提示远程主机强制关闭的错。在网上有人说是代码问题。有人说是硬件CPU问题。如果是代码问题,是不是NIO有访问数量的限制,如果是如何提高这个访问数量。如果是CPU问题,哪还有什么技术能不让CPU过热。请大家帮帮忙,这个问题搞了有一段时间了。

解决方案 »

  1.   

    我估计是操作系统问题吧,哥们你用的是Windows吧?采用NIO+多线程的话,支持几千个连接不会是问题。但Windows操作系统有控制同时打开连接数的,如果你安装过BT、迅雷之类的软件,应该见过它提示要不要修改并发连接数吧?如果你要搞这种大并发网络开发,把系统换成Server版的吧,比如Windows2003 Advanced Server。至于是不是CPU达到上限了,这个看看系统监控里面的CPU使用率不就知道了?
      

  2.   

    主要和操作系统有关,NIO 只是对具体操作系统提供了抽象层。
      

  3.   

    最近我在Linux上测试,上面讲的已经超出打开文件数。这个能从代码上问题解决?是不是每建立一个socket连接就打开一个文件,我在想。如果把他们每一次运行完就关了,这样就不出现连接数太多。我还在想,我的线程数已经有限,怎么说我的打开文件数会超出。这个不明白。在window上没发现这样的问题。请说知道的人告诉我一下。谢谢。
      

  4.   

    无法从代码上解决,必须修改Linux操作系统的最大打开文件数。每个线程可以打开多个Socket的,这个看你的编程模式。另外,服务端开发另外一个很恼火的事情就是,你close了,不代表操作系统就close了。因为操作系统还要发送关闭信息给客户端,并等待客户端的确认关闭信息,然后再来一轮。所以经常你查看网络连接状态时会看到几百上千个CLOSE_WAIT和FIN_WAIT2,都在傻乎乎的等着客户端返回确认关闭信息,不过这个问题可以通过修改配置将关闭的超时等待设置到非常小来解决。用:netstat -ant  看看吧。另外自己Google下了解了解:FIN_WAIT2