当前位置: 首页 > news >正文

Socket BIO NIO AIO 基本概念

1. Socket

1.1. Socket是什么

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 当连接建立成功时,服务端和客户端都会拥有一个Socket实例,每个Socket实例都有一个InputStream和 OutputStream,并通过这两个对象来交换数据。

1.2. Socket工作机制

主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须由底层TCP/IP来建立TCP连接。 建立TCP连接需要底层IP来寻址网络中的主机。 网络层可以根据IP地址来找到目标主机,目标主机上可能运行着多个应用程序,通过TCP或UPD的地址也就是端口号来与指定的应用程序通信。 可以通过一个Socket实例来唯一代表一个主机上的应用程序的通信链路。

1.3. Socket数据传输

当连接已经建立成功时,服务端和客户端都会拥有一个Socket实例,每个Socket实例都有一个InputStream和OutputStream,并通过这两个对象来交换数据。 当创建Socket对象时,操作系统将会为InputStream和OutputStream分别分配一定大小的缓存区,数据的写入和读取都是通过这个缓存区完成的。 写入端将数据写到OutputStream对应的SendQ队列中,当队列填满时,数据将被转移到另一端InputStream 的 RecvQ队列中, 如果这时RecvQ已经满了,那么OutputStream的write方法将会阻塞,直到RecvQ队列有足够的空间容纳SendQ发送的数据。 这个缓存区的大小及写入端的速度和读取端的速度非常影响这个连接的数据传输效率, 由于可能会发生阻塞,所以网络IO与磁盘I/O不同的是数据的写入和读取还要有一个协调的过程, 如果在两边同时传送数据可能会产生死锁。

2. 网络IO模型

2.1. 同步IO和异步IO

一个网络I/O读过程是数据从网卡→内核缓冲区→用户内存的过程。 同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。 异步:用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到系统内核的IO完成的通知。

2.2. 阻塞IO和非阻塞IO

用户程序发起IO操作会经历两阶段: 第一阶段: 内核等待数据 第二阶段: 内核将数据从内核空间拷贝到用户空间 阻塞IO: 两阶段都阻塞 非阻塞IO: 内核等待数据阶段会直接返回异常码,用户程序轮询查询内核数据准备情况, 没有准备好直接返回异常码,用户程序继续下一次轮询 准备好时,用户轮询到来时,内核将数据从内核空间拷贝到用户空间返回

2.3. BIO(同步阻塞IO)

应用程序发起IO请求后,处理线程处于阻塞状态,直到请求的IO数据从内核空间拷贝到用户空间。

2.4. NIO(同步非阻塞IO)

Java NIO 是Java 1.4版本引入的,基于通道(Channel)和缓冲区(Buffer)进行操作,采用非阻塞式 IO 操作,允许线程在等待 IO 时执行其他任务。 应用程序发起IO请求后,内核等待数据时会直接返回异常码, 之后,应用程序通过不断的轮询去检查请求数据是否已经完成 虽然在应用发起IO请求时,无须阻塞。但在内核将数据拷贝到用户空间时,还是会阻塞的,为了保证数据的准确性和系统的安全稳定。

2.4.1. IO多路复用

在同步非阻塞IO模型下,需要通过不断的轮询去检查请求数据是否已经完成,这个过程是很耗CPU的。 因此,便又诞生了I/O多路复用模型。 I/O多路复用模型:使用操作系统提供的多路复用功能(如 select、poll、epoll 等),使得单个线程可以同时处理多个 I/O 事件。 当某个连接上的数据准备好时,操作系统会通知应用程序。 这样,应用程序可以在一个线程中处理多个并发连接,而不需要为每个连接创建一个线程。

2.5. AIO(异步非阻塞IO)

AIO也就是NIO2.0 Java7中引入了NIO的改进版NIO2,它是异步IO模型。 异步IO则是采用“订阅-通知”模式:即应用程序向操作系统注册IO监听,然后继续做自己的事情。 当操作系统发生IO事件,并且准备好数据后,在主动通知应用程序,触发相应的函数.

参考
Socket 学习笔记(一)

ServerSocket与Socket入门详解

Java IO 学习(一)同步/异步/阻塞/非阻塞

如何理解IO模型中用户空间和内核空间?

http://www.jsqmd.com/news/905850/

相关文章:

  • Open-Meteo:如何零成本获取专业级天气数据API的完整指南
  • 太和养老系统:打造智慧养老生态圈 #05272141
  • AI风口上,我靠“养猪”月入过万?算力副业真能躺赚吗?
  • 经典算法题之我能赢吗(二)
  • 【零基础部署】Docker 部署 Redis 保姆级教程
  • Claude集成测试的“最后一公里”难题:如何用确定性重放+语义断言替代传统JSON Schema校验(IEEE测试标准工作组推荐方案)
  • 小白也能看懂!AI大模型概念清单,收藏这份学习指南轻松入门
  • Python新手如何快速接入Taotoken调用大模型API完成第一个对话
  • 卖牛卡纸(原纸)怎么找客户?下游工厂都在哪里
  • 从Python列表切片到LLM接口实战:零基础AI编程落地教程
  • 2026信创网安服务器哪家靠谱?基于五维能力的可靠性评估标准与结论 - 速递信息
  • MySQL密码忘了咋办,派大星来救你
  • 论文ai痕迹怎么去?2026年4款降AI率软件深度推荐+实测
  • 告别杜邦线乱飞!用PCF8574模块和I2C总线,让你的51单片机LCD1602接线清爽起来
  • 从实验室到上车:一份完整的车载毫米波雷达环境与耐久性测试清单
  • taotoken平台api调用稳定性与低延迟实际网络测试感受
  • Layuimini企业级无限级菜单系统:轻量级架构与高性能导航解决方案
  • 2026实测乌鲁木齐四大财税机构:公司注册首选TOP1出炉! - 小柏云
  • Go语言错误处理:Error vs Panic
  • 16 - 常用内置函数与标准库
  • 纯硬件模拟电路实现太阳能MPPT充电与光控照明系统设计
  • GitNexus是Monorepo单体仓库
  • 电磁直线执行器直接驱动的流体控制阀系统【附程序】
  • 【信息科学与工程学】【通信工程】第一百二十一篇 信号处理02 信号处理:小波变换核心算法
  • 别再傻傻分不清了!GTF和GFF3文件格式详解与实战转换指南(附gffread命令)
  • 模型检验中的对称性破缺技术:应对核电站IC系统验证的组合爆炸
  • 八大网盘直链下载助手:告别龟速下载的免费解决方案
  • 决策者选专业法兰厂家踩过的坑:头部TOP4实力对比 - 速递信息
  • Go语言并发模式:常见并发范式
  • 基于Arduino的密码锁系统:从矩阵键盘到伺服电机的完整实现