为了账号安全,请及时绑定邮箱和手机立即绑定

使用nio 中 selectionKey.isReadable()造成 死循环

使用nio 中 selectionKey.isReadable()造成 死循环

慕粉4241372 2018-08-09 14:01:17
@Test public void clientSocket() throws IOException {     SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 9999));     socketChannel.configureBlocking(false);     ByteBuffer byteBuffer = ByteBuffer.allocate(1024);     byteBuffer.put("你好好好好".getBytes());     byteBuffer.flip();     socketChannel.write(byteBuffer);     byteBuffer.clear();     socketChannel.shutdownOutput();     socketChannel.close(); } @Test public void serverSocket() throws IOException {     ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();     serverSocketChannel.configureBlocking(false);     serverSocketChannel.bind(new InetSocketAddress(9999));     Selector selector = Selector.open();     // 注册连接事件     serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);     while (selector.select() > 0) {         Set<SelectionKey> selectionKeySet = selector.selectedKeys();         System.out.println(selectionKeySet.size());         Iterator<SelectionKey> iterator = selectionKeySet.iterator();         while (iterator.hasNext()) {             SelectionKey selectionKey = iterator.next();             if (selectionKey.isAcceptable()) {                 System.out.println("accept=====");                 SocketChannel socketChannel = serverSocketChannel.accept();                 socketChannel.configureBlocking(false);                 socketChannel.register(selector, SelectionKey.OP_READ);             } else if (selectionKey.isReadable()) {                                      System.out.println("read=====");                 SocketChannel socketChannel = (SocketChannel) selectionKey.channel();                 ByteBuffer byteBuffer = ByteBuffer.allocate(1024);                 socketChannel.read(byteBuffer);                 byteBuffer.flip();                 System.out.println(new String(byteBuffer.array()) + ":::::::::::::::::::");                 byteBuffer.clear();             }             iterator.remove();             System.out.println(selectionKeySet.size());         }     } }在client结束后,我末尾打印的selectionKeySet.size()方法,本来是0,结果循环一遍siez却变成1了,仍然会不停的进入selectionKey.isReadable()方法,导致死循环最后iterator应该是移除掉了,但集合里面总有一个SelectionKeyImp的对象,这个是哪里来的?我末尾打印的selectionKeySet.size()方法,本来是0,结果循环一遍又这是控制台:1 [sun.nio.ch.SelectionKeyImpl@4b9e13df] accept===== 0 1 [sun.nio.ch.SelectionKeyImpl@2b98378d] read===== 你好好好好   0 1 [sun.nio.ch.SelectionKeyImpl@2b98378d] read=====             0 1 [sun.nio.ch.SelectionKeyImpl@2b98378d] read=====          0 1 [sun.nio.ch.SelectionKeyImpl@2b98378d] read=====      0 1 [sun.nio.ch.SelectionKeyImpl@2b98378d] read=====
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 2972 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信