NIO中各个概念介绍
Buffer缓冲区
- 用户数据处理的基础单元,nio中的数据操作都是以块状的方式进行的,客户端发送与接受数据都通过Buffer转发进行(在nio中)
- Buffer包括ByteBuffer、CharBuffer、ShortBuffer等
- 写数据:Buffer->Channel,读数据:将数据从Channel读到Buffer
Channel通道
- Channel类似于流, 但有不同于传统的输入输出流,传统的输入输出流具有独占性和单向性,通道则偏向于数据流通的多样性。
- 可以从通道中读取数据也可将数据写到通道,数据单位按块进行.
- 可并发可异步读写数据,一般对于读是独占的,对于写也是独占的,同时进行读或同时进行写可能导致读取的文件乱码,但是读和写之间可以异步进行。
- 读数据读到Buffer,写数据也要通过Buffer写
- Channel包括FileChannel、SocketChannel、DatagramChannel等
Selectors选择器
处理客户端所有事件的分发器- 向Selector注册事件,当Channel满足某个状态的时候事件被触发,例如如当channel为可读状态(即有数据到达时)触发事件,然后将数据读取到Buffer中。
Selector使用流程
- open()开启一个选择器,可以给选择器注册需要关注的事件
- register()将一个Channel注册到选择器,当选择器触发对应关注事件时回调到Channel中,处理相关数据。
- select()/selectNow():Selector是一个半观察者模式,当事件到达时,Selector需要自己区遍历池子区找到就绪事件,调用select()/selectNow()即可遍历,去处理当前可用的、待处理的通道数据,返回的是待处理事件的集合
- selectKeys()的到当前就绪的通道
- wakeUp()唤醒一个处于select状态的选择器
- close()关闭一个选择器,所有注册事件都被注销
Selector注意事项
- 注册到选择器的通道必须处于非阻塞状态
- FileChannel不能用于Selector,因为FileChannel不能切换为非阻塞模式,读取文件用于都是堵塞状态,它一直都是可读的,套接字通道可以
Selector SelectionKey
1.Interest集合、Ready集合 2. Channel通道 3. Selector选择器 4. obj附加值四个基本事件
- SelectionKey.OP_CONNECT连接就绪 当客户端想要连接到服务器的时候,连接需要经过TCP的三次握手,建立连接是一个耗时的操作,客户端想要等待连接建立好以后再进行后续的数据操作,但是当你要写数据的时候,网卡也有可能处于繁忙状态,要等待网卡空闲时数据才能被发出去,这时我们就需要注册一些写的事件
- SelectionKey.OP_ACCEPT : 接受就绪 当客户端发送一个连接到服务器端时,服务器端会收到客户端的连接到来,服务端可以选择拒绝客户端连接或建立连接,当客户端连接正常建立好以后,服务器端就会收到连接就绪,服务器端首先要注册一个接受就绪的事件,当有客户端来连接的时候触发事件
- SelectionKey.OP_READ 读就绪 读数据即有数据到来
- SelectionKey.OP_WRITER 写数据
Charset扩展部分
- Charset字符编码: 加密、解密
- 原生支持的、数据通道级别的数据处理方式,可以用于数据传输级别的数据加密、解密等操作.