偶的服务器:nio,困惑!

06-06-28 sisi_622

偶的项目要求服务器支持2000个连接并发: (1)全双工的 (2)长连接的。也许错误选择了java,又错误使用了nio.

(1)连接数太大,偶用了线程池和nio.

(2)每100个连接分配一个MsgMgr,每个MsgMgr又开了三个线程:分别处理收,发和处理消息。

(3)因考虑到双工,偶每个MsgMgr使用两个selector:即每个socketchannel向两个selector分别注册读、写interOps.

(4)偶又开了一个线程序分配一个selector处理连接事件。

这样设计是否有问题,因偶觉得总线程数目太大,性能很差。

偶关于nio还有下面的问题,需要请教大家。

(1)一个selector在windows下好象只支持64个连接的并发,那是否意味着偶在windows下一个selector最多能被64个socketChannel注册?(确实有64个socketChannel同时读写的可能)。

(2)读写分开用selector有什么弊端,JVM支持selector的数目是否有限制,因为我发现每selector.open()会打开很多的监听端口

,请问nio为何要这么做??

(3)因偶是长连接,所以对每个socketchannel都要不停发beatMsg,按说这应该在MsgMgr中再开一beatThread,但偶觉得线程数目太庞大了,想将其放在处理线程中,是否会影响处理消息的速度,有什么解决办法?

偶经验不足,希望大家帮忙提些建议。多谢!

    

trueshow
2006-07-04 09:53

对你的问题感同身受.我的服务器需要不断接受连接,客户端会在不通知的情况下自行断开连接,平均每2秒就出现一次这种情况,在windows2003下运行时,我观察到句柄数不断增加,当增加到1万多少句柄时,就提示内存不足或回调错误,然后程序就崩了.这似乎是因为服务器端并没有自动删除注册在selector中的channel的对象,导致句柄不断增加.

我该如何解决这个问题呢?

希望有机会与你沟通...我的email:trueshow@163.com

banq
2006-07-04 16:27

建议参考我的书籍<Java实用系统开发指南>中第一章基于NIO的框架。

这个网址可下载第一章案例,希望对你有用。

http://www.jdon.com/mybook/support.htm