星球狂想战队|深度解读Netty:NIO那些不为人知的秘密( 三 )


JavaNIO
NIO(NewIO或者No-BlockingIO) , 从JDK1.4开始引入的非阻塞IO , 是一种非阻塞+同步的通信模式 。 这里的NoBlockingIO用于区分上面的BIO 。
NIO本身想解决BIO的并发问题 , 通过Reactor模式的事件驱动机制来达到NonBlocking的 。 当socket有流可读或可写入socket时 , 操作系统会相应的通知应用程序进行处理 , 应用再将流读取到缓冲区或写入操作系统 。
也就是说 , 这个时候 , 已经不是一个连接就要对应一个处理线程了 , 而是有效的请求 , 对应一个线程 , 当连接没有数据时 , 是没有工作线程来处理的 。
当一个连接创建后 , 不需要对应一个线程 , 这个连接会被注册到多路复用器上面 , 所以所有的连接只需要一个线程就可以搞定 , 当这个线程中的多路复用器进行轮询的时候 , 发现连接上有请求的话 , 才开启一个线程进行处理 , 也就是一个请求一个线程模式 。
NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现 , 如下图结构所示 。 这里涉及的Reactor设计模式、多路复用Selector、Buffer等暂时不用管 , 后面会讲到 。
与NIO不同 , 当进行读写操作时 , 只需直接调用API的read或write方法即可 。 这两种方法均为异步的 , 对于读操作而言 , 当有流可读取时 , 操作系统会将可读的流传入read方法的缓冲区 , 并通知应用程序;对于写操作而言 , 当操作系统将write方法传递的流写入完毕时 , 操作系统主动通知应用程序 。 即可以理解为 , read/write方法都是异步的 , 完成后会主动调用回调函数 。 在JDK7中 , 提供了异步文件通道和异步套接字通道的实现 , 这部分内容被称作NIO.
AIO方式使用于连接数目多且连接比较长(重操作)的架构 , 比如相册服务器 , 充分调用OS参与并发操作 , 编程比较复杂 , JDK7开始支持 。
目前来说AIO的应用还不是很广泛 , Netty之前也尝试使用过AIO , 不过又放弃了 。
二、NIO核心组件介绍1.Channel
在NIO中 , 基本所有的IO操作都是从Channel开始的 , Channel通过Buffer(缓冲区)进行读写操作 。
read()表示读取通道中数据到缓冲区 , write()表示把缓冲区数据写入到通道 。
SocketChannel:一个客户端发起TCP连接的ChannelServerSocketChannel:一个服务端监听新连接的TCPChannel , 对于每一个新的Client连接 , 都会建立一个对应的SocketChannelFileChannel:从文件中读写数据其中SocketChannel和ServerSocketChannel是网络编程中最常用的 , 一会在最后的示例代码中会有讲解到具体用法 。
【星球狂想战队|深度解读Netty:NIO那些不为人知的秘密】2.Buffer
概念
Buffer也被称为内存缓冲区 , 本质上就是内存中的一块 , 我们可以将数据写入这块内存 , 之后从这块内存中读取数据 。 也可以将这块内存封装成NIOBuffer对象 , 并提供一组常用的方法 , 方便我们对该块内存进行读写操作 。


推荐阅读