Java 网络原理 ①-IO多路复用 || 自定义协议 || XML || JSON
这里是Themberfue
在学习完简单的网络编程后,我们将更加深入网络的学习——HTTP协议、TCP协议、UDP协议、IP协议...........
IO多路复用
✨在上一节基于 TCP 协议 编写应用层代码时,我们通过一个线程处理连接的申请,随后通过多线程或者线程池来处理对每个客户端的请求;这样,一个客户端就对应一个线程。
但随着客户端的数量不断增加,反复的创建和销毁线程,其开销都是很大的,哪怕是通过线程池处理,开销也是不容小觑的。
✨所以,为了解决这一问题,IO多路复用便诞生了:传统的IO操作是 阻塞式 的,当程序等待一个IO操作时,其他的IO操作会挂起,而 IO多路复用 允许程序同时监视多个 IO通道,从而不用为每个IO通道都单独地创建线程或进程。
简单来说,就是一个线程就可以同时处理多个客户端的请求。
✨举个例子:在大学生活中,给室友带饭是非常常见的的现象,假如你现在给两个室友带饭(总共买三份,你自己也得吃啊),你就要出去买三份晚餐,假设这三份晚餐都是在不一样的小吃摊贩卖的。
这里的视角是,你是服务端,小吃摊老板是客户端,小吃摊老板做完后给你相当于给你发送请求,代入这个视角更好理解~~~
第一种购买方案:你到了小吃摊A跟老板A说要一份晚餐,你等待老板A做完后,立刻去小吃摊B跟老板B说要一份晚餐,你等待老板B做完后,立刻去小吃摊C跟老板C说要一份晚餐,你等待老板C做完后;OK,此时全部请求处理完了。这里就相当于是单个线程处理完一个请求后立马处理下一个请求。
第二种购买方案:你叫上其他两个认识的人(这里以甲乙丙代称),和你一起去买,甲到小吃摊A小吃摊A跟老板A说要一份晚餐,乙到小吃摊B跟老板B说要一份晚餐,丙到小吃摊C跟老板C说要一份晚餐;等到三份晚餐都做完后,全部请求也就处理完了。这里就相当于是创建了多个线程同时处理多个请求。
第三种购买方案:依旧是你一个人买三份晚餐,但与第一种方案不同的是,你到了小吃摊A跟老板A说要一份晚餐,此时你立刻去小吃摊B跟老板B说要一份晚餐,随后又去吃摊C跟老板C说要一份晚餐;然后你就开始等他们做了,小吃摊A老板A做完后,你去拿,小吃摊B老板B做完后,你去拿,小吃摊C老板C做完后,你去拿;拿完全部之后,全部请求也就处理完了。这里就只用了一个线程就同时处理了多个请求。这便是 IO多路复用 的形象比喻。
✨一般来说,绝大部分客户端,大部分时间都是沉默的,虽然连接了,但不会一直发送请求,此时工作线程等待就行了,等到客户端发来请求后,工作线程处理就OK了;很小的概率会说多个客户端同时发送请求的,这时候就灵活切换到线程池就可以了~~~
✨目前,IO多路复用 是服务器开发中主流的核心技术;不过这并不需要程序员自己实现,这是操作系统内置的,只需要调用API即可;Java通过 NIO 封装了 IO多路复用。
❤️以下是GPT-4o对 IO多路复用 的简单讲解:
IO 多路复用(I/O Multiplexing)
IO 多路复用是一种高效管理多个 IO 通信通道的技术,常用于需要同时处理多个网络连接或文件描述符的场景,比如高并发服务器的设计。它通过一种机制,让程序可以同时监听多个 IO 事件(如读、写、错误),并根据事件的发生进行相应处理。
1. 什么是 IO 多路复用?
传统的 IO 操作是 阻塞式 的,当程序等待一个 IO 操作完成时,其他的 IO 操作会被挂起。IO 多路复用允许程序同时监视多个 IO 通道,而不用为每个通道都创建独立的线程或进程。
2. 核心思想
IO 多路复用通过一个单独的线程或进程,利用系统调用 轮询 或 事件通知 的方式,等待多个文件描述符上发生的事件,并在事件发生时通知应用程序处理。
3. 常见的 IO 多路复用机制
select
- 原理:
通过将一组文件描述符放入一个集合中,交给内核监听。内核阻塞直到其中一个文件描述符准备就绪。- 特点:
- 跨平台支持好。
- 文件描述符数量有限制(通常是 1024)。
- 缺点:
- 每次调用都需要重新设置监听集合。
- 随着文件描述符增多,性能下降。
poll
- 原理:
类似于select
,但用链表代替固定大小的集合。- 特点:
- 无文件描述符数量限制。
- 支持更大规模的并发连接。
- 缺点:
- 仍需轮询文件描述符,性能会随描述符增多而下降。
epoll
- 原理:
提供事件驱动机制,支持 边缘触发 和 水平触发 模式。- 特点:
- 只需注册一次文件描述符,后续只需监听。
- 高效,适合高并发场景。
- 优点:
- 内核维护了一个事件表,避免了重复传递描述符集合。
- 边缘触发模式减少了无效通知。
4. IO 多路复用与传统模型的比较
模型 描述 优缺点 阻塞 IO 程序阻塞直到 IO 完成。 简单直观,但效率低。 非阻塞 IO 程序不断轮询 IO 状态,直到操作完成。 CPU 开销大,适用于短时间 IO 操作。 IO 多路复用 一个线程监控多个文件描述符的 IO 状态,统一处理就绪事件。 高效,适用于大量连接但 IO 操作较少的场景。 多线程/多进程 IO 为每个连接创建线程/进程进行 IO 操作。 简化编程模型,但线程/进程开销大,不适合高并发。 异步 IO 操作提交后立即返回,由操作系统完成 IO,并通知程序。 高效,但实现复杂,且操作系统支持有限。
5. IO 多路复用的应用场景
高并发网络服务器:
- 需要同时处理大量的客户端连接。
- 示例:Web 服务器、聊天室、负载均衡器。
实时通信:
- 实时监控多个 IO 通道,快速响应。
- 示例:即时聊天、视频直播。
文件监控和操作:
- 需要监听多个文件或套接字的状态。
- 示例:日志实时监控工具。
6. IO 多路复用的优缺点
优点
- 单线程即可管理多个 IO,减少线程上下文切换。
- 提高了系统的吞吐能力,适合高并发场景。
- 灵活,可根据不同的 IO 状态做不同处理。
缺点
- 编程复杂度较高。
select
和poll
的性能在高连接数时会显著下降。- 对某些事件处理可能需要特殊优化。
7. epoll 的工作模式
水平触发(LT, Level Triggered):
文件描述符有事件发生时会不断通知应用程序,直到事件被处理完毕。
特点:简单可靠,但可能导致重复通知。边缘触发(ET, Edge Triggered):
文件描述符只有在事件发生的那一刻通知一次,之后不会重复通知。
特点:高效,但要求应用程序及时处理数据。
总结
IO 多路复用是现代高并发服务器的基础,能够高效管理多个 IO 通道。在实际开发中,根据场景选择合适的多路复用机制(如
select
、poll
或epoll
),并结合具体业务需求和性能要求进行优化设计。
自定义协议
✨作为程序员的我们一般都是工作在应用层的,应用层所涉及到的许多的网络通信协议大多都是程序员自己自定义的;这里的自定义的并不是说单独写一个新的协议,类似于 TCP、UDP、IP协议这种,当然了,我们也大概率没有那个能力。
✨这里的自定义协议通常规定客户端在请求时发送给服务器的特定数据,然后服务端根据这些数据进行解析,随后返回响应给客户端。
✨自定义协议通常指在网络通信中,为特定应用设计的一套规则,用于定义通信双方如何组织、传输和解释数据。通常情况下,程序员需要根据实际需求在应用层设计自定义协议,确保不同系统或设备之间能够正确通信。
如何自定义协议
✨第一:需要明确需求,根据业务场景和逻辑进行自定义规则的编写,确定传输哪些数据。
✨第二:约定好数据的组织格式。
✨我们以点外卖为例子进行说明,进行点外卖前,我们肯定得先选择哪个店家,所以软件会显示出数家外卖店家;在显示出外卖店家前,还有一个步骤是用户看不到,那就是在点击进入店家浏览页面时,你作为客户端会立即向该软件的服务器发送一个请求;但不能单单地发送请求,这里就需要明确客户端发送哪些数据。
比如:请求应该发送 客户的id、客户的位置、客户的经纬度、客户的偏好......,有了这些数据,服务器就会根据这些数据进行解析。
服务器解析完后,就会给客户端返回一个响应,响应的数据可能包括:商家id、商家名称、商家图片、商家评分、商家热门商品、配送费用......
在传输数据之前,如果没有一个约定好的格式对这些数据进行组织,这些数据就会乱套,导致数据解析发送错误,这便是第二步的 约定好数据的组织格式 的重要性。
组织数据的格式
✨纯文本
数据以简单的字符串形式存储,每行或每部分以分隔符(如逗号、空格、换行符)区分。
# 请求数据 114514,江西省赣州市....,24N115E,螺狮粉\n# 响应数据 1,商家名称1,商家图片1,商家评分1,商家热门商品1,配送费用\n 2,商家名称2,商家图片2,商家评分2,商家热门商品2,配送费用\n 3,商家名称3,商家图片3,商家评分3,商家热门商品3,配送费用\n 4,商家名称4,商家图片4,商家评分4,商家热门商品4,配送费用\n
类似于上面的组织格式,以 ',' 来规定数据列之间的间隔,以' \n' 来规定数据行之间的间隔;当然,这里的格式纯属由程序员喜好自定义,这便是自定义的一步。
优点:
- 简单易懂,几乎不需要学习成本。
- 易于使用文本编辑器查看和修改。
- 对小型文件非常友好。
缺点:
- 缺乏结构化信息,难以表示复杂数据。
- 易出错,无法验证数据有效性。
- 没有标准化支持。
适用场景:简单的日志记录、小型配置文件。
✨XML
(eXtensible Markup Language)一种标记语言,使用标签组织层级化数据;类似于 HTML,但 HTML 的标签是规定好的,而 XML 则可以由程序员自定义。
<!-- 请求 --> <request><userId>114514</userId><userPosition>江西省赣州市</userPosition><transit>24N115E</transit><favor>螺狮粉</favor> </request><!-- 响应 --> <response><shop><id>1</id><nickName>商家名称1</nickName><image>商家图片1</image><rank>商家评分1</rank><hotGoods>商家热门商品1</hotGoods><sendPrice>配送费用</sendPrice></shop> </response>
- 优点:
- 可读性强
- 表示层次结构和复杂关系非常直观。
- 可扩展性强,可以自定义标签。
- 配备丰富的验证工具(如 DTD、XSD)。
- 缺点:
- 数据量大,冗余较多,影响传输效率。
- 人工编辑不直观,容易出错。
- 性能比 JSON 和二进制格式差。
- 传输带宽消耗大
- 适用场景:早期的 Web 服务(SOAP)、配置文件、文档管理。
✨JSON
(JavaScript Object Notation)一种轻量级的数据交换格式,基于键值对。
{userId:114514,userPosition:江西省赣州市,transit:24N115E,favor:螺狮粉 }
优点:
- 简单易读,结构直观。
- 数据量较小,相比 XML 更适合网络传输。
- 被广泛支持,大多数语言都内置 JSON 解析库。
- 支持数组,易表示复杂数据结构。
缺点:
- 不支持注释,调试配置文件时不够灵活。
- 无内置数据类型定义(如数字的范围、枚举值等)。
- 在数据量特别大时,解析性能仍逊于二进制格式。
适用场景:RESTful API、前后端数据交换、轻量级配置文件。
✨Protobuf
(Protocol Buffers)Google 开发的一种高效的二进制序列化格式。
// 数据结构定义文件 .proto message User {int32 id = 1;string position = "江西省赣州市";string transit = "24N115E";string favor = "螺狮粉"; }// 对应的二进制序列化数据: 0A 05 41 6C 69 63 65 10 1E 1A 08 4E 65 77 20 59 6F 72 6B
- 优点:
- 序列化后数据体积小,性能高。
- 使用
.proto
文件强类型定义数据结构,防止数据错误。- 向后兼容性好,可升级字段。
- 缺点:
- 可读性差,不适合直接查看和调试。
- 初学者需要学习其数据定义和生成工具的使用。
- 适用场景:高性能分布式系统、大规模数据传输(如微服务之间通信)。
✨对比总结
特性 纯文本 XML JSON Protobuf 可读性 很高 中等 高 很低 结构化支持 低 很强 强 很强 效率(传输/解析) 较低 较低 较高 很高 文件体积 较小 很大 较小 很小 兼容性 低 中等 高 很高 使用场景 简单场景 配置和层次数据 API 和交换数据 高性能传输 选择数据格式的建议
- 小型项目或临时数据:使用纯文本或 JSON。
- 复杂结构的配置文件:可以使用 JSON 或 XML。
- 高性能需求或大规模系统:优先选择 Protobuf。
- 需要易读性和广泛兼容性:选择 JSON。
- 层次结构复杂且需要强校验:选择 XML。
不同场景选择合适的格式,能够显著提高项目的可维护性和效率。
下节我们将进入著名的应用层协议——HTTP/HTTPS协议的讲解~~~
毕竟不知后事如何,且听下回分解
❤️❤️❤️❤️❤️❤️❤️
相关文章:

Java 网络原理 ①-IO多路复用 || 自定义协议 || XML || JSON
这里是Themberfue 在学习完简单的网络编程后,我们将更加深入网络的学习——HTTP协议、TCP协议、UDP协议、IP协议........... IO多路复用 ✨在上一节基于 TCP 协议 编写应用层代码时,我们通过一个线程处理连接的申请,随后通过多线程或者线程…...
Bash Shell知识合集
1. chmod命令 创建一个bash shell脚本 hello.sh ~script $ touch hello.sh脚本创建完成后并不能直接执行,我们要用chmod命令授予它可执行的权限: ~script $ chmod 755 hello.sh授权后的脚本可以直接执行: ~script $ ./hello.sh2.指定运行…...
从0入门自主空中机器人-1【课程介绍】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
Doris使用注意点
自己学习过程中整理,非官方 dws等最后用于查询的表可以考虑使用row存储加快查询,即用空间换时间duplicate key的选择要考虑最常查询使用适当使用bloomfilter 加速查询适当使用aggregate 模式降低max,avg,min之类的计算并加快查询…...

Mybatis插件better-mybatis-generator的下载与使用
1.下载 找到设置 插件 搜索better-mybatis-generator 下载并且重启IDEA 2.连接数据库 点击测试连接 连接成功如下图 3.使用插件 选择对应的表 右击选择 注意:mysql8.0驱动一定要勾上mysql_8 其他地方不要动 然后实体类 mapper xml就都生成好了 mapper里有默认增删…...
uniapp小程序实现弹幕不重叠
uniapp小程序实现弹幕不重叠 1、在父组件中引入弹幕组件 <template><!-- 弹幕 --><barrage ref"barrage" class"barrage-content" reloadDanmu"reloadDanmu"></barrage> </template> <script>import barr…...

快速排序学习优化
首先,上图。 ‘’’ cpp int partSort(int *a ,int left,int right) {int keyi left; //做左侧基准while(left<right){while(left<right && a[right]>a[keyi]){right--;}while(left<right && a[left]<a[keyi]){left;}swap(a[left…...

微信流量主挑战:三天25用户!功能未完善?(新纪元4)
🎉【小程序上线第三天!突破25用户大关!】🎉 嘿,大家好!今天是我们小程序上线的第三天,我们的用户量已经突破了25个!昨天还是16个,今天一觉醒来竟然有25个!这涨…...
jetson 无显示器配置WIFI
我使用的 jetpack 版本是 6.1,发现自带 NetworkManager 软件包,此软件包包含一个守护程序、一个命令行界面(nmcli)和一个基于 curses 的界面(nmtui)。 可以使用 nmcli 命令配置wifi,nmcli 示例…...

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)
上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…...
【ES6复习笔记】ES6的模块化(18)
模块化的概念 模块化是指将一个复杂的系统分解为多个模块,每个模块完成一个特定的功能,模块之间通过接口进行通信。模块化的目的是提高代码的可读性、可维护性和可重用性。 模块化规范产品, ES6 之前的模块化规范有: CommonJS …...

兰亭妙微:专注医疗 UI 设计,点亮数字化医疗新视界
医疗行业界面解决方案以医患使用者为中心,遵循行业使用习惯和表达方式,优化使用流程、设计简洁、人性化的操作界面,采用插画、三维动画、微动效的创作方法,让用户感受到愉悦易用美观的使用体验。蓝蓝设计与知名企业合作项目有&…...
c# 线程 AutoResetEvent 的Set()函数多次调用
本文部分内容摘自ChatGPT 在 C# 中,AutoResetEvent 是一种用于线程同步的机制,它的行为类似于一个信号量,主要用于在多线程环境中发出信号并控制线程的执行。AutoResetEvent 的主要特点是每当调用 Set() 方法时,信号会被设置&…...
汽车行业的MES系统方案(附案例资料合集)
针对汽车行业的MES系统方案,以下是一些关键点和实施案例: 核心功能: 实时监控:MES系统通过传感器和物联网技术实时监控生产线上的每一个环节,确保信息的及时传递。数据分析:系统对收集的数据进行深度分析&a…...
基于监督学习的神经网络控制算法详细介绍和例程
基于监督学习的神经网络控制算法通常用于对已有数据进行训练,以学习输入与输出之间的映射关系。下面我将详细介绍这种算法的原理和流程,并提供一个简单的例程: 算法原理: 输入:给定一组已知的输入信号和对应的输出控制…...
springMVC-请求响应
springmvc——一 站式web框架,核心是处理http请求响应。 前后端分离:需要序列化,服务端把数据序列化成字符串或者流给前端,前端又把json转成对象,前端的叫反序列化。前端把数据序列化转成字符串给服务器,服…...
数据交易和联邦学习的背景下的安全属性
数据交易和联邦学习的背景下的安全属性 在数据交易和联邦学习的背景下,安全属性对于保护数据隐私、确保系统可靠性和维护交易公平性至关重要。以下将分析文章中涉及的安全属性以及分析这些属性的目的。 涉及的安全属性 双向认证:文章虽未明确提及传统意义上的双向认证机制,…...

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点: 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…...

Datawhale-AI冬令营二期
目录 一、番茄时钟(1)输入Prompt(2)创建 HTML 文件解析1:HTML结构解析2:计时器内容解析3:按钮区域解析4:脚本引用 (3)使用JavaScript实现时钟功能解析1&#…...
Python的秘密基地--[章节7] Python 并发与多线程编程
第7章:Python 并发与多线程编程 随着计算机硬件的发展,多核处理器已经成为主流。为了更好地利用多核资源,提高程序的运行效率,Python 提供了并发(Concurrency)和并行(Parallelism)编…...
端午编程小游戏--艾草驱邪
刚刚过去的端午,参加了学校的一个活动,用python做了一个小游戏,当然这个小游戏还可以继续改进,可以加个bgm什么的...... 可以小玩一下 import pygame import random import math import sys import timepygame.init() pygame.mi…...
Go深入学习延迟语句
1 延迟语句是什么 编程的时候,经常会需要申请一些资源,比如数据库连接、文件、锁等,这些资源需要再使用后释放掉,否则会造成内存泄露。但是编程人员经常容易忘记释放这些资源,从而造成一些事故。 Go 语言直接在语言层…...

纳米AI搜索与百度AI搜、豆包的核心差异解析
一、技术定位与设计目标 1、纳米AI搜索:轻量化边缘计算导向 专注于实时数据处理与资源受限环境下的高效响应,通过算法优化和模型压缩技术,实现在物联网设备、智能终端等低功耗场景的本地化部署。其核心优势在于减少云端依赖,保障…...
Java Map完全指南:从基础到高级应用
文章目录 1. Map接口概述Map的基本特性 2. Map接口的核心方法基本操作方法批量操作方法 3. 主要实现类详解3.1 HashMap3.2 LinkedHashMap3.3 TreeMap3.4 ConcurrentHashMap 4. 高级特性和方法4.1 JDK 1.8新增方法4.2 Stream API结合使用 5. 性能比较和选择建议性能对比表选择建…...
[Harmony]颜色初始化
默认初始化颜色 let color: Color 0xFF00FF 创建一个工具,用十六进制颜色和RGBA初始化颜色 // 颜色工具类 export class ColorUtils {/*** 十六进制颜色初始化(支持透明度)* param hex 支持格式:#RRGGBB、#AARRGGBB、0xRRGGBB、…...
Shell编程核心符号与格式化操作详解
Shell编程作为Linux系统管理和自动化运维的核心技能,掌握其常用符号和格式化操作是提升脚本开发效率的关键。本文将深入解析Shell中重定向、管道符、EOF、输入输出格式化等核心概念,并通过丰富的实践案例帮助读者掌握这些重要技能。 一、信息传递与重定…...
CSS radial-gradient函数详解
目录 基本语法 关键参数详解 1. 渐变形状(Shape) 2. 渐变大小(Size) 3. 中心点位置(Position) 4. 颜色断点(Color Stops) 常见应用场景 1. 基本圆形渐变 2. 椭圆渐变 3. 模…...

springMVC-11 中文乱码处理
前言 本文介绍了springMVC中文乱码的解决方案,同时也贴出了本人遇到过的其他乱码情况,可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法,通过javaW…...
[蓝桥杯 2024 国 B] 立定跳远
问题描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 n 个检查点 a1,a2,...,an且 ai≥ai−1>0。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时,小明可以自行再增加 m 个检查点让自己跳得更轻松。在运动会前…...

【数据结构】6. 时间与空间复杂度
文章目录 一、算法效率1、算法的复杂度 二、时间复杂度1、时间复杂度的概念2、大O的渐进表示法3、常见时间复杂度计算1)实例12)实例23)实例34)实例45)实例56)实例67)实例78)实例8 三…...