写点什么

Java 网络编程 IO 模型 --- BIO、NIO、AIO 详解

作者:Bug终结者
  • 2022 年 8 月 03 日
  • 本文字数:1603 字

    阅读完需:约 5 分钟

Java网络编程IO模型 --- BIO、NIO、AIO详解

📢📢📢📣📣📣<br>哈喽!大家好,我是【Bug 终结者,【CSDN 新星创作者】🏆,阿里云技术博主🏆,51CTO 人气博主🏆,INfoQ 写作专家🏆 <br/>一位上进心十足,拥有极强学习力的【Java 领域博主】😜😜😜 <br/>🏅【Bug 终结者】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。 偶尔会分享些前端基础知识,会更新实战项目,面向企业级开发应用!🏅 如果有对【后端技术】、【前端领域】感兴趣的【小可爱】,欢迎关注【Bug 终结者】💞💞💞<br>❤️❤️❤️ 感谢各位大可爱小可爱! ❤️❤️❤️


一、I/O 模型

1.1 I/O 模型基本说明

I/O 模型的简单理解:I/O 模型就是用什么样的通道进行数据的发送和接受,很大程度上决定了程序通信的性能

1.2 Java 支持的 3 种网络编程 I/O 模式

Java 共支持 3 种网络编程模型 I/O 模式:BIO、NIO、AIO

1.3 JavaBIO(同步阻塞)

JavaBIO:传统的阻塞模式


同步且阻塞(传统阻塞性),服务器实现模式为一个连接一个服务器,即客户端有连接请求时服务器就需要启动一个线程进行处理,

如果这个连接不做任何事情会造成不必要的线程开销


下图为 BIO 简单执行流程



传统的阻塞式


BIO 的缺点是客户端一直在连接服务器,服务器会为每一个客户端开辟一个线程对客户端处理,但有时客户端不是一直对服务器进行 IO 操作的,所以这样会导致服务器阻塞,进而对服务器产生很多不必要的线程开销,资源浪费

1.4 JavaNIO (同步非阻塞)

JavaNIO:同步非阻塞


同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上(Selector),

多路复用轮询到连接有 I/O 请求就进行处理


下图为 NIO 简单执行流程



NIO 的优点


由于客户端不是一直对服务器进行 IO 操作的,所以通过 Selector 选择器进行轮询,均匀分配到需要对服务器进行 IO 操作的客户端,这样就利用了客户端闲置的时间来节省服务器内存的消耗


当然,如果客户端数量增大,服务器就要再开一个 Thread 连接 Selector 进行轮询分配,以此类推,这样就充分的减少内存消耗

1.5 JavaAIO(异步非阻塞)

JavaAIO:异步非阻塞


异步非阻塞,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统

完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用


AIO 目前并没有得到广泛的应用


AIO 和操作系统有非常密切的关系


我们就不再进行画图讲解了,AIO 了解即可

二、BIO、NIO、AIO 适用场景分析

2.1 BIO 应用场景

BIO 方式适用于连接数目比较少且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序简单易理解

2.2 NIO 应用场景

NIO 方式适用于连接数目较多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等,

编程比较复杂,JDK1.4 开始支持

2.3 AIO 应用场景

AIO 方式使用于连接数目较多且连接时间较长(重操作)的架构,比如相册服务器,充分调用 OS 操作系统参与并发操作,

编程比较复杂,JDK1.7 开始支持

三、BIO、NIO、AIO 的区别


BIO 同步阻塞到理发店理发,理发店人多,就一直等理发师,知道轮到自己理发


NIO 同步非阻塞


到理发店理发,发现理发店人很多,就先告诉理发师说一会再来,自己先去干其它事情,一会再回来看看是否轮到了自己


AIO 异步非阻塞


给理发师打电话,让理发师上门服务,自己干其它事情,理发师自己来家里理发


⛲小结

以上就是【Bug 终结者】对 Java 网络编程 IO 模型简单的理解,小编认为 Java 中支持三种网络编程 IO 模型,BIO、NIO、AIONetty 对 NIO 又做了一层封装,要学 Netty,那就得先把网络编程模型搞懂,相信到这里,你已经对 BIO、NIO、AIO 有了一个大致的理解,通过本文能加固你对 BIO、NIO、AIO 的理解


如果这篇【文章】有帮助到你,希望可以给【Bug 终结者】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

发布于: 刚刚阅读数: 3
用户头像

Bug终结者

关注

励志成为一个优秀的开发者~ 2021.12.09 加入

星星之火,可以燎原

评论

发布
暂无评论
Java网络编程IO模型 --- BIO、NIO、AIO详解_Java_Bug终结者_InfoQ写作社区