Java NIO操作类型


JAVA NIO共定义了四种操作类型:OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT,分别对应读、写、请求连接、接受连接等网络Socket操作。ServerSocketChannel和SocketChannel可以注册自己感兴趣的操作类型,当对应操作类型的就绪条件满足时OS会通知channel,下表描述各种Channel允许注册的操作类型,Y表示允许注册,N表示不允许注册,其中服务器SocketChannel指由服务器ServerSocketChannel.accept()返回的对象。

  OP_READ OP_WRITE OP_CONNECT OP_ACCEPT
服务器ServerSocketChannel N N N Y
服务器SocketChannel Y Y N N
客户端SocketChannel Y Y Y N

客户端请求连接,服务器端接受连接,客户端与服务器端开始相互发送消息(读写),按这个逻辑上表就容易理解。为了更深入理解,我们可以看看每个操作类型的就绪条件。

操作类型 就绪条件及说明
OP_READ 当操作系统读缓冲区有数据可读时就绪。并非时刻都有数据可读,所以一般需要注册该操作,仅当有就绪时才发起读操作,有的放矢,避免浪费CPU。
OP_WRITE 当操作系统写缓冲区有空闲空间时就绪。一般情况下写缓冲区都有空闲空间,小块数据直接写入即可,没必要注册该操作类型,否则该条件不断就绪浪费CPU;但如果是写密集型的任务,比如文件下载等,缓冲区很可能满,注册该操作类型就很有必要,同时注意写完后取消注册。
OP_CONNECT 当SocketChannel.connect()请求连接成功后就绪。该操作只给客户端使用。
OP_ACCEPT 当接收到一个客户端连接请求时就绪。该操作只给服务器使用。

java.nio.channels.SelectionKey类定义了这四种操作类型并提供就绪判断方法:

public final boolean isReadable() {
        return (readyOps() & OP_READ) != 0;
    }
   
public final boolean isWritable() {
        return (readyOps() & OP_WRITE) != 0;
    }   
   
public final boolean isConnectable() {
        return (readyOps() & OP_CONNECT) != 0;
    } 
   
public final boolean isAcceptable() {
        return (readyOps() & OP_ACCEPT) != 0;
    }

Java中介者设计模式

Java 设计模式之模板方法开发中应用

设计模式之 Java 中的单例模式(Singleton)

Java对象序列化

大话设计模式(带目录完整版) PDF+源代码

Java中的函数传递

本文永久更新链接地址:

相关内容