首页 新闻 赞助 找找看

收藏 java nio 问题

0
悬赏园豆:80 [已解决问题] 解决于 2014-03-28 15:36

问题描述如下:
鄙人在写nio简单例子的时候出现了很奇怪的问题,服务器端部分代码如下:

while (selector.select() > 0) 
{
  Set<SelectionKey> readyKeys = selector.selectedKeys();
   Iterator it = readyKeys.iterator();
   System.out.println("while out");
   while (it.hasNext()) 
   {
      System.out.println("while in");
      SelectionKey key = (SelectionKey) it.next();
      it.remove();
      if (key.isAcceptable()) 
    {
       System.out.println("Key is Acceptable");
       socket = (SocketChannel) ssc.accept();
       socket.configureBlocking(false);
       socket.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE);
    }
    if (key.isReadable()) {
                        
        System.out.println("Key is readable");
        socket = (SocketChannel) key.channel();
        ByteBuffer buf = ByteBuffer.allocate(25);
        buf.clear();
        socket.read(buf);
        buf.flip();
        Charset charset = Charset.forName("us-ascii");
        CharsetDecoder decoder = charset.newDecoder();
        CharBuffer charBuffer = decoder.decode(buf);
        String result = charBuffer.toString();
        System.out.println("Receive Data:" + result);
       // key.cancel();如果这个注释的话,就会进行无限循环
    }
                    
}

客户端发送代码:为

public static int sendMessage(SocketChannel client) {
        String msg = null;
        ByteBuffer bytebuf=ByteBuffer.allocate(1024);
        int nBytes = 0;
        try {
            msg = "It's message from client!";
            System.out.println("msg is "+msg);
            
            
                bytebuf.clear();
                bytebuf.put(msg.getBytes());
                bytebuf.flip();
                nBytes = client.write(bytebuf);
                System.out.println("It's message from client!".getBytes().length);
                
            
            client.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return nBytes;
     }

客户端和服务器端的部分代码就是上面的,客户端发送数据给服务器端,服务器按道理执行了
SelectionKey key = (SelectionKey) it.next();
it.remove();的代码之后注销了该键,如果执行完读操作之后,只要加上key.cancel()之后才可以正常读取一条数据。it.remove()之后为什么selector.select() > 0依然成立,运行代码的打印结果:
while out
while in
Key is readable
Receive Data:
while out
while in
Key is readable
Receive Data:
while out
while in
Key is readable
Receive Data:。。。。。
求高手解答。

问题补充:

没人回答吗

coding的人生的主页 coding的人生 | 初学一级 | 园豆:130
提问于:2013-01-18 13:24
< >
分享
最佳答案
1
while (selector.select() > 0)
没有cancel这个key的话,select()返回一直都是大于0的数
收获园豆:80
chagroy | 菜鸟二级 |园豆:282 | 2013-01-21 22:43

现在我想想也是,毕竟cancel之后,才会把key从集合中移除,但是我保持长连接的话,cancel之后会把连接也中断吗?

coding的人生 | 园豆:130 (初学一级) | 2013-01-21 22:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册