这是我参与更文挑战的第2天,活动详情查看: 更文挑战
什么是NIO?
英文java non-blocking IO,指JDK提供的新API,JDK1.4后提供的改进输入输出的新特性,相关类在java.nio下,对原IO包中的很多类进行了改写,是同步非阻塞的。
NIO的3大核心?
Buffer缓冲区:本质是一块可以写入数据,可以从中读取数据的内存。这块内存被包装成Buffer对象,并提供一组方法,用来方便的访问该块内存,底层是一个数据。
Channel通道: 类似流,流是单向的。通道呢?我们可以从通道中读取数据,又可以写数据到通道。
Selector选择器:是NIO的一个组件,能够检查多个NIO通道,并确定哪些通道已经做好准备进行读取或写入。
三者之间的关系为:
上图总结:
1)每个channel都会对应一个Buffer,进行数据读写;
2)一个Selector对应对个channel,Selector会根据不同的时间,在各个通道上切换;
IO模型?
为了更好的理解网络编程IO模型,这里回顾上次内容进行对比:
1.BIO:同步阻塞,服务器实现模式为一个连接一个线程,会造成不必要的线程开销;
2.NIO:同步非阻塞,服务器实现模式是一个线程处理多个请求连接,即客户端发送的连接请求都会注册到多路复用器上,多路轮询到连接有IO请求就进行处理。
3.BIO以字节流进而字符流的方式处理数据,而NIO基于Channel和Buffer进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入到甬道中,Selector用于监听多个甬道的事件,使单个线程可以监听多个客户端甬道。
4 BIO适用于连接数小且固定的架构,NIO适用于连接数目多且连接比较短的架构,比如聊天服务器,弹幕,服务器通讯等。
遗留问题:
1)什么是多路复用器?
2)一个线程最多能处理多少个连接请求?
3)Selector、channel和Buffer具体如何操作?