nio经验

阅读更多

   当有 客户端 连接请求时:

 

        SocketChannel socketChannel1 = serverSocketChannel.accept();

 

一般情况下,会设置 Blocking 为 false 非阻塞的,如下:

 

        socketChannel1.configureBlocking(false);
        socketChannel1.register(this.selector, SelectionKey.OP_READ );

 

但是,如果设置为阻塞:

 

        socketChannel1.configureBlocking(true);
//     socketChannel1.register(this.selector, SelectionKey.OP_READ );

 

则,就不能进行 register 注册事件操作了,相应的,也不会有事件通知,对客户端的读需要用一只循环从流中读,如果有就读出来,如果没有则阻塞住,直到有可读的数据:

socketChannel.read(byteBuffer);//阻塞,直到有数据

或者 

socketChannel1.socket().getInputStream().read(byte[]);//也会阻塞

 

 

 

另外,在设置block 模式之前,如果去读,也是阻塞的。

        SocketChannel socketChannel1 = serverSocketChannel.accept();
       
        socketChannel.read(byteBuffer);//阻塞,直到有数据

        socketChannel1.configureBlocking(false);
        socketChannel1.register(this.selector, SelectionKey.OP_READ );

 

设置 非阻塞之后,就是非阻塞了,可以正常接收读事件。

 

 

 

你可能感兴趣的:(nio,java,阻塞)