33. bio和nio

文章目录

    • 一、bio网络模型
      • 1.1 bio网络模型示意图
      • 1.2 bio网络模型缺点
    • 二、NIO网络模型
      • 2.1 nio网络模型示意图
      • 2.2 nio网络模型的改进
    • 三、NIO核心- Channel(通道)
      • 3.1 Channel 简介
      • 3.2 Channel 实现类
      • 3.3 bio的socket 和 nio的channel代码实现
    • 四、NIO核心- buffer(缓冲区)
      • 4.1 buffer简介
      • 4.2 buffer属性
      • 4.3 buffer的API
    • 五、NIO核心- Select(选择器)
      • 5.1 简介
      • 5.2 核心API
      • 5.3 SelectionKey简介
    • 六、NIO编程实现步骤
    • 七、总结

一、bio网络模型

1.1 bio网络模型示意图

单个客户端向服务器发起请求时,请求顺序如下:
33. bio和nio_第1张图片

多个客户端向一个服务器发起请求时,请求顺序如下:
33. bio和nio_第2张图片

1.2 bio网络模型缺点

1.阻塞式I/O

服务器端的线程会因为阻塞I/O,一直阻塞,等待客户端的请求。
若客户端一直不发起,服务端的业务线程会一直存在。

2.弹性伸缩能力差

因为一个客户端对应一个服务端的业务线程,那么客户端和服务端线程数是1比1的关系,再好的机器也难以承受过多的线程。

3.多线程耗费资源

线程的创建销毁、大量的线程存在服务端,服务端的cpu调度资源都会存在影响

二、NIO网络模型

2.1 nio网络模型示意图

单个客户端向服务器发起请求时,请求顺序如下:
33. bio和nio_第3张图片

2.2 nio网络模型的改进

1.非阻塞式I/O

nio模型是基于非阻塞式I/O构建出来的,服务器端提供一个单线程的select,统一管理所有客户端接入的socket链接,并负责监听每个链接所关心的事件。

2.弹性伸缩能力强

因为服务端不是多个线程来处理,而是一个线程就可以处理所有请求,所有客户端和服务端线程数是1比N的关系,理论上可以接入无限的请求。

3.单线程节省资源

减少了线程的创建和销毁,以及线程上下文的切换问题。

三、NIO核心- Channel(通道)

3.1 Channel 简介

1.双向性

信息传输的通道,jdk的nio是对输入输出的方式的另一种抽象,类比bio中的流的概念。
不同的是流是单向传输,分输入流输出流。而通道支持双向传输,一个channel既可读又可写。

2.非阻塞性

传统流是阻塞模式,而channel可以工作在非阻塞模式下。

3.操作唯一性

操作channel的唯一方式是buffer,通过buffer操作channel实现数据块的回写

3.2 Channel 实现类

1.文件类 : FileChannel - 对文件进行读写的流 2.UDP类 :DatagramChannel - 用于UDP的数据读写 3.TCP类 : ServerSocketChannel/SocketChannel 基于TCP的数据读写

3.3 bio的socket 和 nio的channel代码实现

bio的socket代码实现逻辑
33. bio和nio_第4张图片

nio的channel代码实现逻辑
33. bio和nio_第5张图片

四、NIO核心- buffer(缓冲区)

4.1 buffer简介

作用 - 读写channel中的数据或者将数据写到channnel中。
本质 - 一块内存区域。这块内存能读数据,写数据,被nio封装成了一个buffer对象,提供了一系列API。

4.2 buffer属性

1.Capacity:容量 - 表明数组可以容纳多少字节,如果写入的字节数超过最大容量,那么需要清空后,才能继续往里面写入数据。
2.Position: 位置 - position表示当前位置,初始化为0,当一个byte写入后,position会移动到下一个可插入的数据单元。position最大可为容量减1
3.Limit:上限(写模式下) -limit表示最多能往buffer里写入多少数据,此模式下limit等于Capacity。
4.Limit:上限(读模式下) -limit表示最多能从buffer里读多少数据,这时limit会被设置成Position值
5.Mark:标记 - 表示一个特定的position位置,可以通过调用buffer的reset方法恢复到这个position位置。

4.3 buffer的API

1.初始化
33. bio和nio_第6张图片

2.写数据
33. bio和nio_第7张图片

3.写模式切换为读模式
33. bio和nio_第8张图片

4.读取一个字节
33. bio和nio_第9张图片

5.设置mark标记
33. bio和nio_第10张图片

6.回到标志位
33. bio和nio_第11张图片

7.重置属性
33. bio和nio_第12张图片

五、NIO核心- Select(选择器)

5.1 简介

1.作用 - I/O就绪选择
2.地位 - NIO网络编程的基础
3.定义 - select是java的nio中能够检测1到多个nio通道,并能够知晓通道是否为诸如读写事件做好准备的组件,通过他,一个单独的线程就可以管理多个channel,从而管理多个链接。

5.2 核心API

33. bio和nio_第13张图片

5.3 SelectionKey简介

1.四种就绪状态常量
    connect 连接就绪
    accept  接收就绪
    read    读就绪
    write   写就绪

六、NIO编程实现步骤

33. bio和nio_第14张图片
33. bio和nio_第15张图片
33. bio和nio_第16张图片

七、总结

33. bio和nio_第17张图片
33. bio和nio_第18张图片
33. bio和nio_第19张图片
33. bio和nio_第20张图片
33. bio和nio_第21张图片

你可能感兴趣的:(#,9,知识点,nio,bio)