近阶段在学习java nio的问题,对其中的Selector类,对select()方法等一直问题多多,现有以下疑问,期待各位高手的不吝赐教。
   1、一个Selector()最多可以注册多少个Channels呢,听同事说,unix c里面的这个是可以配置的,默认为64个。请问,java是否也有这样的一个数量大小的配置?
   2、当一个socketchannel是可以read的时候,立即把里面的数据读出来,可是我要不关闭连接和流的话,socketchannel.read(ByteBuffer)就一直返回0,还是占用了一个线程,请问,我是否可以在读完流里面的数据后,取消掉read的注册?然后再重新注册这个socketchannel?
   3、请问哪位有用java nio做服务端的实例?可以支持大并发量的那种?非常感谢!

解决方案 »

  1.   

    1) Java自动管理,与unix下不太一样。我建议你作个试验,看看能支持多少个channel。我采用windows平台,底层的api不一样,windows异步通讯没有这个限制(采用CompeletionPort)。如果只有64个限制,请设计一个数据请求线程池,很容易吧?
    2)很奇怪,当channel可以读时,你需要直接读取(利用线程池读写数据),读完缓冲区,需要设计报文识别器,看看是否完整报文等等操作。然后继续等待读取。不需要取消的,但需要继续注册。
    // Resume interest in OP_READ
    key.interestOps(key.interestOps() | SelectionKey.OP_READ);
    // Cycle the selector so this key is active again
    key.selector().wakeup();
    3)我做过一个异步通讯服务器,支持协议可配置可自动识别等。对于通讯部分,已经完成,在考虑能够支持JMS等方面功能。这个不是例子,不能公开。
    我的msn: [email protected],菜鸟就不要来烦我了哦