实际的I/O读写操作都是由Unsafe接口负责完成的。
bind方法主要用于绑定指定的端口,对于服务端,用于绑定监听端口,可以设置backlog参数;对于客户端,主要用于指定客户端Channel的本地绑定Socket地址。
disconnect方法用于客户端或者服务器端主动关闭连接。
close方法,在链路关闭之前需要首先判断是否处于刷新状态,如果处于刷新状态说明还有消息尚未发送出去,需要等到所有消息发送完成再关闭链路,因此,将关闭操作封装成Runnable稍后再执行。
write方法实际上将消息添加到环形发送数组中,并不是真正的写Channel。如果Channel没有处于激活状态,说明TCP链路还没有真正建立成功,当前Channel存在以下两种状态。
(1)Channel打开,但是TCP链路尚未建立成功:NOT_YET_CONNECTED_EXCEPTION;
(2)Channel已经关闭:CLOSE_CHANNEL_EXCEPTION.
如果链路状态正常,则将需要发送的msg和promise放入发送缓冲区中(环形数组)。
flush方法负责将发送缓冲区中待发送的消息全部写入到Channel中,并发送给通信对方。
connect方法:
首先获取当前的连接状态进行缓存,然后发起连接操作,SocketChannel执行connect()操作有三种可能的结果:
(1)连接成功,返回true;
(2)暂时没有连接上,服务端没有返回ACK应答,连接结果不确定,返回false;
(3)连接失败,直接抛出I/O异常。
如果是第(2)种结果,需要将NioSocketChannel中的selectionKey设置为OP_CONNECT,监听连接应答消息。
异步连接返回之后,需要判断连接结果,如果连接成功,则触发ChannelActive事件,ChannelActive事件最终会将NioSocketChannel中的selectionKey设置为SelectionKey.OP_READ,用于监听网络读操作位。