3种网络编程 I/O 模型:BIO、NIO、AIO
成都创新互联公司是专业的射阳网站建设公司,射阳接单;提供成都网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行射阳网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!- BIO:同步并阻塞(传统阻塞型),一个连接一个线程,连接数目比较小且固定的架构场景
- NIO:同步非阻塞,一个线程处理多个连接,连接数目多且连接比较短的架构场景
- AIO:异步非阻塞,Proactor 模式,有效请求才启动线程,连接数较多且连接时间较长场景
BIO(blocking I/O)
- 基本介绍:传统的 Java IO 编程
- BIO:同步阻塞
- 简单流程
- 服务器启动一个 ServerSocket
- 客户端启动一个 Socket 进行通信,默认每个客户端建立一个线程进行通讯
- 客户端发起请求后先咨询服务器是否有线程响应,没有就等待或者被拒绝
NIO(Java non-blocking IO)
- 三大核心部分:Channel、Buffer、Selector
- 每个 Channel 会对应一个 Buffer
- Selector 对应一个线程,一个线程对应多个 Channel(连接)
- Selector 切换到哪个 Channel 由事件决定,Event 就是一个重要概念
- Selector 会根据不同的事件,在各个通道上切换
- Buffer 就是一个内存块,底层有一个数组
- 数据的读取写入是通过 Buffer(BIO 要么是输入或者输出流,不能双向,但是NIO的 Buffer 可以读也可以写,需要 flip 切换)
- Channel 是双向的,可以返回底层操作系统的情况,比如 Linux,底层的操作系统通道就是双向的
- NIO 面向缓冲区或者面向块
- 基本介绍
- 使用线程从某通道发送请求或者读取数据,仅能获取目前可用的数据,如果目前没有数据可用,就什么都不会获取,而不是保持线程阻塞
- 通俗理解:用一个线程处理多个操作
- HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,比HTTP1.1大了好几个数量级
- NIO 和 BIO
- BIO 以流处理数据,NIO 以块处理数据,块 I/O 效率比流 I/O 高很多
- BIO 阻塞,NIO 非阻塞
- BIO 基于字节流和字符流进行操作,NIO 基于 Channel 和 Buffer 进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入通道中
- Selector 用于监听多个通道的事件(连接请求,数据到达),所以单个线程能监听多个客户端通道
- 缓冲区(Buffer)
- 本质上就是一个可以读写的内存块,理解成一个容器对象(含数组)
- 缓冲区对象内置流一些机制,能够跟踪和记录缓冲区的状态变化情况
- 属性
- Capacicty:容量,缓冲区创建的时候被设定并且不能改变
- Limit:当前终点,不能对缓冲区超过极限的位置进行读写操作,且极限是可以修改的
- Position:位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变的值,为下次做准备
- Mark:标记
- 通道(Channel)
- NIO 通道类似于流
- 可以同时读写,流只能读或者写
- 可以实现异步读写数据
- 可以从缓冲读数据,可以写数据到缓冲
- BIO 中的 stream 是单向的,NIO 中的 Channel 是双向的可读写
- Channel 在 NIO 中时一个接口,常用 FileChannel、DatagramChannel、ServerSocketChannel、SocketChannel
- FileChannel:用于文件的读写
- DatagramChannel:用于 UDP 的数据读写
- ServerSocketChannel、SocketChannel 用于 TCP 的数据读写
- 选择器(Selector)
- 基本介绍
- Selector 能够检测多个注册的通道上是否有事件发生,有就获取事件然后针对每个事件进行相应的处理
- 只有在连接真正有读写事件发生时,才会进行读写,减少开销
- 避免多线程之间的上下文切换导致的开销
- Selector、SelectionKey、ServerSocketChannel、SocketChannel 关系
- 客户端连接时,会通过 ServerSocketChannel 得到 SocketChannel
- Selector 开始监听
- 将 SocketChannel 注册到 Selector 上,一个 Selector 可以注册多个 SocketChannel
- 注册后返回一个 SelectionKey 会和该 Selector 关联(集合)
- Selector 进行监听 select 方法,返回有事件发生的通道个数
- 进一步得到各个 SelectionKey(有事件发生)
- 再通过 SelectionKey 反向获取 SocketChannel
- 可以通过 channel() 方法得到 channel,完成业务处理
- SelectionKey
- 表示 Selector 和网络通道的注册关系
- OP_ACCEPT:有新的网络连接可以 accept,值为 16
- OP_CONNECT:代表连接已经建立,值为 8
- OP_WRITE:代表写操作,值为 4
- OP_READ:代表读操作,值为 1
- ServerSocketChannel
- 在服务器端监听新的客户端 Socket 连接
- 相关方法
- open:得到一个 ServerSocketChannel 通道
- bind:设置服务器端口号
- configureBlocking:设置阻塞或非阻塞模式
- accept:接受一个连接
- register:注册一个选择器并设置监听事件
- SocketChannel
- 网络 IO 通道,具体负责进行读写操作,NIO 把缓冲区的数据写入通道,或者把通道数据写入缓冲区
- 相关方法
- open
- configureBlocking
- connect
- finnishConnect
- write
- read
- register
- close
- 存在问题
- NIO 类库和 API 繁杂,需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等
- 需要具备 Java 多线程编程,NIO 编程涉及 Reactor 模式,必须对多线程和网络编程非常熟悉才能写出高质量的 NIO 程序
- 开发工作量和难度都非常大,例如:临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流
- NIO Bug:Epoll Bug,导致 Selector 空轮询,CPU 100%
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享名称:JavaIO:BIO、NIO-创新互联
文章路径:
http://njwzjz.com/article/hhjij.html