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%
 posted on 2019-10-06 10:19  徐杰  阅读(191)  评论(0编辑  收藏  举报