NIO模型学习笔记
简介
Non-blocking I/O 或New I/O
自JDK1.4开始使用
应用场景:高并发网络服务器支持
概念理解
模型:对事物共性的抽象
编程模型:对编程共性的抽象
BIO网络模型
阻塞IO
BIO连接过程
1、监听建立连接请求
2、发起建立连接请求
3、服务端启动新线程
4、线程响应客户端
5、等待客户端再次请求
BIO网络模型缺点
- 阻塞式IO模型
- 弹性伸缩能力差
- 多线程耗资源
NIO网络模型
特点
非阻塞IO
弹性伸缩能力强
单线程节省资源
模型图
核心类
Channel:通道
特点:
- 双向性:可读可写
- 非阻塞性
- 操作唯一性:只能通过Buffer操作Channel
实现
- 文件类:FileChannel
- UDP类:DatagramChannel
- TCP类:ServerSocketChannel/SocketChannel
Buffer:缓冲区
作用:读写Channel中数据
本质:一块内存区域
属性
- Capacity:容量(相当于数组的长度)
- Position:位置(相当于数组的角标)
- Limit:上限(写模式下,limit=Capacity,读模式下,limit=从buffer中最多读取的数量)
- Mark:标记
Selector:选择器或多路复用器
作用:IO就绪选择
地位:NIO网络编程的基础
SelectionKey简介
- 四种就绪状态常量
- 有价值的属性
NIO编程实现步骤
服务端步骤
- 第一步:创建Selector
- 第二步:创建ServerSocketChannel,并绑定监听端口
- 第三步:将Channel设置为非阻塞模式
- 第四步:将Channel注册到Selector上,监听连接事件
- 第五步:循环调用Selector的select方法,检测就绪情况
- 第六步:调用SelectedKeys方法获取就绪channel集合
- 第七步: 判断就绪事件种类,调用业务处理方法
- 第八步:根据业务需要决定是否再次注册监听事件,重复执行第三步操作
客户端步骤
- 连接服务器端
- 向服务器端发送数据
- 接收服务器端的响应
NIO网络编程缺陷
- 麻烦:NIO类库和API繁琐
- 心累:工作量和难度较大
- 有坑:Selector空轮训,导致CPU100%