网站首页 > java教程 正文
本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解。网络编程的基本模型是C/S模型,即两个进程间的通信。服务端提供IP和监听端口,客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。
在了解BIO,NIO,AIO之前先了解一下IO的几个概念:
1、同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。 例如自己亲自出马持银行卡到银行取钱;
2、异步:用户触发IO操作以后,可以去干别的事,IO操作完成以后再通知当前线程。例如让小弟去银行帮你取钱,你可以干别的事;
3、阻塞:当试图进行读写文件的时候,发现不可读取或没东西读,则进入等待状态直到可读。例如ATM排队取钱;
4、非阻塞:用户进程访问数据时,会马上返回一个状态值(可读或不可读),例如在银行柜台办理业务,先取个号,然后坐在椅子上做其它事,你可以不断问大堂经理排到了没有,大堂经理如果说还没到,你就不能去,直到广播通知你去办理,(使用非阻塞IO时,如果不能读写,Java调用会马上返回,当IO事件分发器通知可读写时,再继续进行读写,不断循环直到读写完成)。
同步阻塞(JAVA BIO),每一个socket套接字需要使用一个线程来处理。建立连接、进行读写操作的时候都可能阻塞。在服务器端如果要支持并发的连接时,需要更多的线程。连接不做任何事情的时候会造成不必要的线程开销,可通过线程池来改善。
NIO(同步非阻塞) ,基于事件驱动(在程序里,程序停止在那不动,你点击一个按钮,它就有反应了,过一会,又没反应了,你再点一下,它又继续运行),采用的Reactor模式(Reactor模式,首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入请求(Event)多路复用地分发给相应的Request Handler)。Reactor会处理所有客户端的Socket套接字的事件,然后派发到不同的线程中。这样就解决了BIO中为了支撑更多的Socket套接字而需要更多的线程。
AIO(异步非阻塞),AIO采用了Proactor模式,AIO与NIO的不同之处在于当AIO在进行读写操作时,不用先等通知,可直接调用相应的read/write方法,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序,而NIO的通知是发生在动作之前的,是在可读、写的时候,Selector发现了这些事件后调用Handler处理。
来源网络,侵权联系删除
私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包。
猜你喜欢
- 2024-09-10 Netty面试秘籍-1.什么是 Netty,它在网络编程中解决了什么问题?
- 2024-09-10 清华毕业大佬终于把Java网络编程面试题整理完了
- 2024-09-10 Java网络编程重点(java实现网络编程)
- 2024-09-10 Java学习:Java网络编程之TCP协议(java tcp ip socket编程)
- 2024-09-10 最全Java架构师技能树:Java编程+网络+设计模式+数据库+分布式
- 2024-09-10 Java网络编程之TCP服务器底层原理与实现
- 2024-09-10 Java面试八股文Netty网络编程,select
- 2024-09-10 Java 网络IO编程总结(网络编程java常用方法)
- 2024-09-10 想学习Java网络编程,从何入手?(java中的网络编程)
- 2024-09-10 不“精通”Java网络和并发编程也能学好Netty,这份Neety手册绝了
你 发表评论:
欢迎- 最近发表
-
- java8的stream使用小示例(java stream的用法)
- Java 中的 Lambda 表达式深入解析:从语法糖到高阶函数
- 实战解析Android架构设计原则(android的架构)
- 搭建mcp服务器用java17,可是项目开发用的是java8怎么实现?
- Java Stream:集合处理的api(java集合流操作)
- Java 8新特性全面剖析:让编程变得更简单优雅
- Java 8新特性全面解析与最佳实践:掌握未来编程的艺术
- Java 8日期时间API新特性揭秘与深度解析
- Java 8 Stream API 详解(java.stream)
- Java机器学习库(Java ML)(二、聚类)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)