第二章 NIO
1. NIO概述
NIO 全称New IO,也叫Non-Block IO 是一种
非阻塞同步
的通信模式。NIO是对BIO的补充和完善,目的在于提升IO的处理效率。
2. NIO的设计原理
客户端和服务器之间通过
Channel
通信。NIO可以在Channel进行读写操作。这些Channel都会被注册在Selector多路复用器
上。Selector通过一个线程不停的轮询这些Channel。找出已经准备就绪的Channel执行IO操作。NIO 通过一个线程轮询
,实现千万个客户端的请求,这就是非阻塞NIO的特点。
1)
缓冲区Buffer
:它是NIO与BIO的一个重要区别。BIO是将数据直接写入或读取到Stream对象中。而NIO的数据操作都是在缓冲区中进行的。缓冲区实际上是一个数组。Buffer最常见的类型是ByteBuffer,另外还有CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
2)
通道Channel
:和流不同,通道是双向
的。NIO可以通过Channel进行数据的读或写或同时读写操作。通道分为两大类:一类是网络读写
(SelectableChannel),一类是用于文件操作
(FileChannel),我们使用的SocketChannel和ServerSocketChannel都是SelectableChannel的子类。
3)
多路复用器Selector
:NIO编程的基础。多路复用器提供选择已经就绪的任务的能力。就是Selector会不断地轮询注册在其上的通道(Channel),如果某个通道处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以取得就绪的Channel集合,从而进行后续的IO操作。服务器端只要提供一个线程负责Selector的轮询,就可以接入成千上万个客户端,这就是JDK NIO库的巨大进步。
3. Buffer缓冲区的读写模式
Capacity指开辟的缓冲区大小。写模式下,Position指缓冲区中当前状态下数据写入到了缓冲区的什么位置,而Limit和Capacity相等。读模式下,Limit指缓冲区中当前状态下数据可以被读取到什么位置,而Position等于缓冲区的起始位置。图中表示的含义为当Buffer由写模式切换到读模式时Position和Limit的变化。
4. 代码解析
1)把通道注册到多路复用器上。
2)对注册在多路复用器上的通道进行轮询
3)Buffer缓冲区的读操作
4)Buffer缓冲区的写操作
5. NIO【JDK 1.4】小结
NIO模型中通过SocketChannel和ServerSocketChannel完成套接字通道的实现。非阻塞/阻塞,同步,避免TCP建立连接使用三次握手带来的开销。NIO模型减少了数组操作,利用了缓存数据方便的保存和清空操作进行IO的处理。
Reactor模型提倡的是:
公共注册,统一操作
。