1. 缓存区
缓冲区数据被读完之后,再读需要调用rewind()
也叫倒带,再继续调用get()
就可以了。
2. 通道Channel
NIO中一个连接就用一个通道来表示。
2.1 通道类型
- FileChannel:用于文件数据的读写
- SocketChannel:用于Socket套接字TCP连接数据的读写
- ServerSocketChannel:服务器监听通道,允许我们监听Socket请求,为每个监听到的请求创建SocketChannel套接字通道
- DatagramChannel:数据报通道,用于UDP协议的数据读写。
2.1.1 SocketChannel
在NIO中,涉及网络连接的通道有两个,一个是SocketChannel负责连接传输,另一个是ServerSocketChannel负责连接的监听。
ServerSocketChannel应用于服务器端,而SocketChannel同时处于服务器端和客户端。换句话说,对应于一个连接,两端都有一个负责传输的SocketChannel传输通道
3. 选择器
选择器的使命是完成IO的多路复用。一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况。选择器和通道的关系,是监控和被监控的关系。
可供选择器监控的通道IO事件类型,包括以下四种:
- 可读:SelectionKey.OP_READ
- 可写:SelectionKey.OP_WRITE
- 连接:SelectionKey.OP_CONNECT
- 接收:SelectionKey.OP_ACCEPT 。比如某个ServerSocketChannel服务器通道,监听到一个新连接的到来,则处于“接收就绪”(OP_ACCEPT)状态
3.1 SelectionKey 选择键
SelectionKey
就是Selector
和Channel
之间的桥梁。即Selector
和SelectionKey
的事件产生关系
SelectableChannel.register(selector, SelectionKey.OP_ACCEPT);
selector 对SelectionKey 1对n
SelectionKey 对Channel:1对1
通道和选择器的监控关系注册成功后,就可以选择就绪事件。具体的选择工作,和调用选择器Selector的select()方法来完成。通过select方法,选择器可以不断地选择通道中所发生操作的就绪状态,返回注册过的感兴趣的那些IO事件。