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

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 多路复用机制

  1. select

    • 原理
      通过将一组文件描述符放入一个集合中,交给内核监听。内核阻塞直到其中一个文件描述符准备就绪。
    • 特点
      • 跨平台支持好。
      • 文件描述符数量有限制(通常是 1024)。
    • 缺点
      • 每次调用都需要重新设置监听集合。
      • 随着文件描述符增多,性能下降。
  2. poll

    • 原理
      类似于 select,但用链表代替固定大小的集合。
    • 特点
      • 无文件描述符数量限制。
      • 支持更大规模的并发连接。
    • 缺点
      • 仍需轮询文件描述符,性能会随描述符增多而下降。
  3. epoll

    • 原理
      提供事件驱动机制,支持 边缘触发水平触发 模式。
    • 特点
      • 只需注册一次文件描述符,后续只需监听。
      • 高效,适合高并发场景。
    • 优点
      • 内核维护了一个事件表,避免了重复传递描述符集合。
      • 边缘触发模式减少了无效通知。

4. IO 多路复用与传统模型的比较

模型描述优缺点
阻塞 IO程序阻塞直到 IO 完成。简单直观,但效率低。
非阻塞 IO程序不断轮询 IO 状态,直到操作完成。CPU 开销大,适用于短时间 IO 操作。
IO 多路复用一个线程监控多个文件描述符的 IO 状态,统一处理就绪事件。高效,适用于大量连接但 IO 操作较少的场景。
多线程/多进程 IO为每个连接创建线程/进程进行 IO 操作。简化编程模型,但线程/进程开销大,不适合高并发。
异步 IO操作提交后立即返回,由操作系统完成 IO,并通知程序。高效,但实现复杂,且操作系统支持有限。

5. IO 多路复用的应用场景

  1. 高并发网络服务器

    • 需要同时处理大量的客户端连接。
    • 示例:Web 服务器、聊天室、负载均衡器。
  2. 实时通信

    • 实时监控多个 IO 通道,快速响应。
    • 示例:即时聊天、视频直播。
  3. 文件监控和操作

    • 需要监听多个文件或套接字的状态。
    • 示例:日志实时监控工具。

6. IO 多路复用的优缺点

优点
  • 单线程即可管理多个 IO,减少线程上下文切换。
  • 提高了系统的吞吐能力,适合高并发场景。
  • 灵活,可根据不同的 IO 状态做不同处理。
缺点
  • 编程复杂度较高。
  • selectpoll 的性能在高连接数时会显著下降。
  • 对某些事件处理可能需要特殊优化。

7. epoll 的工作模式

  • 水平触发(LT, Level Triggered)
    文件描述符有事件发生时会不断通知应用程序,直到事件被处理完毕。
    特点:简单可靠,但可能导致重复通知。

  • 边缘触发(ET, Edge Triggered)
    文件描述符只有在事件发生的那一刻通知一次,之后不会重复通知。
    特点:高效,但要求应用程序及时处理数据。


总结

IO 多路复用是现代高并发服务器的基础,能够高效管理多个 IO 通道。在实际开发中,根据场景选择合适的多路复用机制(如 selectpollepoll),并结合具体业务需求和性能要求进行优化设计。


自定义协议 

        ✨作为程序员的我们一般都是工作在应用层的,应用层所涉及到的许多的网络通信协议大多都是程序员自己自定义的;这里的自定义的并不是说单独写一个新的协议,类似于 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' 来规定数据行之间的间隔;当然,这里的格式纯属由程序员喜好自定义,这便是自定义的一步。

  • 优点

    1. 简单易懂,几乎不需要学习成本。
    2. 易于使用文本编辑器查看和修改。
    3. 对小型文件非常友好。
  • 缺点

    1. 缺乏结构化信息,难以表示复杂数据。
    2. 易出错,无法验证数据有效性。
    3. 没有标准化支持。
  • 适用场景:简单的日志记录、小型配置文件。


✨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>
  • 优点
    1. 可读性强
    2. 表示层次结构和复杂关系非常直观。
    3. 可扩展性强,可以自定义标签。
    4. 配备丰富的验证工具(如 DTD、XSD)。
  • 缺点
    1. 数据量大,冗余较多,影响传输效率。
    2. 人工编辑不直观,容易出错。
    3. 性能比 JSON 和二进制格式差。
    4. 传输带宽消耗大
  • 适用场景:早期的 Web 服务(SOAP)、配置文件、文档管理。

✨JSON

        JavaScript Object Notation)一种轻量级的数据交换格式,基于键值对。

{userId:114514,userPosition:江西省赣州市,transit:24N115E,favor:螺狮粉
}
  • 优点

    1. 简单易读,结构直观。
    2. 数据量较小,相比 XML 更适合网络传输。
    3. 被广泛支持,大多数语言都内置 JSON 解析库。
    4. 支持数组,易表示复杂数据结构。
  • 缺点

    1. 不支持注释,调试配置文件时不够灵活。
    2. 无内置数据类型定义(如数字的范围、枚举值等)。
    3. 在数据量特别大时,解析性能仍逊于二进制格式。
  • 适用场景: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
  • 优点
    1. 序列化后数据体积小,性能高。
    2. 使用 .proto 文件强类型定义数据结构,防止数据错误。
    3. 向后兼容性好,可升级字段。
  • 缺点
    1. 可读性差,不适合直接查看和调试。
    2. 初学者需要学习其数据定义和生成工具的使用。
  • 适用场景:高性能分布式系统、大规模数据传输(如微服务之间通信)。

✨对比总结
特性纯文本XMLJSONProtobuf
可读性很高中等很低
结构化支持很强很强
效率(传输/解析)较低较低较高很高
文件体积较小很大较小很小
兼容性中等很高
使用场景简单场景配置和层次数据API 和交换数据高性能传输

选择数据格式的建议

  1. 小型项目或临时数据:使用纯文本或 JSON。
  2. 复杂结构的配置文件:可以使用 JSON 或 XML。
  3. 高性能需求或大规模系统:优先选择 Protobuf。
  4. 需要易读性和广泛兼容性:选择 JSON。
  5. 层次结构复杂且需要强校验:选择 XML。

不同场景选择合适的格式,能够显著提高项目的可维护性和效率。

 下节我们将进入著名的应用层协议——HTTP/HTTPS协议的讲解~~~

毕竟不知后事如何,且听下回分解 

❤️❤️❤️❤️❤️❤️❤️

 

相关文章:

Java 网络原理 ①-IO多路复用 || 自定义协议 || XML || JSON

这里是Themberfue 在学习完简单的网络编程后&#xff0c;我们将更加深入网络的学习——HTTP协议、TCP协议、UDP协议、IP协议........... IO多路复用 ✨在上一节基于 TCP 协议 编写应用层代码时&#xff0c;我们通过一个线程处理连接的申请&#xff0c;随后通过多线程或者线程…...

828华为云征文|使用sysbench对Flexus X实例对mysql进行性能测评

目录 一、Flexus X实例概述 1.1?Flexus X实例 1.2?在mysql方面的优势 二、在服务器上安装MySQL 2.1 在宝塔上安装docker 2.2 使用宝塔安装mysql 2.3 准备测试数据库和数据库表 三、安装sysbench并进行性能测试 3.1 使用yum命令sysbench 3.2?运行?sysbench 并进行…...

数据结构:堆

目录 1.堆的概念 2.堆的结构 3.堆的初始化 4.堆的销毁 5.堆的插入 6.堆的删除 7.判断堆是否为空 1.堆的概念 堆的性质&#xff1a; 堆中某个结点的值总是不大于或不小于其父结点的值&#xff1b; 堆总是一棵完全二叉树。 以下堆的结构默认大堆 &#xff1a; 2.堆的结…...

洪水灾害多智能体分布式模拟示例代码

1. 环境定义&#xff1a;支持灾害动态、地理数据和分布式架构 import numpy as np import random import matplotlib.pyplot as plt# 新疆主要城市及邻接关系 XINJIANG_CITIES {Urumqi: [Changji, Shihezi],Changji: [Urumqi, Shihezi, Turpan],Shihezi: [Urumqi, Changji, K…...

基于 Ragflow 搭建知识库-初步实践

基于 Ragflow 搭建知识库-初步实践 一、简介 Ragflow 是一个强大的工具&#xff0c;可用于构建知识库&#xff0c;实现高效的知识检索和查询功能。本文介绍如何利用 Ragflow 搭建知识库&#xff0c;包括环境准备、安装步骤、配置过程以及基本使用方法。 二、环境准备 硬件要…...

Selenium实践总结

1.使用显示等待而不是隐式等待 隐式等待可能会导致不可预测的测试行为&#xff0c;尤其是在动态 Web 应用程序中。显式等待&#xff0c;它允许您 等待特定条件发生后再继续测试&#xff0c;这种方法提供了更多的控制和可靠性。 WebDriverWait wait new WebDriverWait(drive…...

华为麦芒5(安卓6)termux记录 使用ddns-go,alist

下载0.119bate1 安卓5和6版本,不能换源,其他源似乎都用不了,如果root可以直接用面具模块 https://github.com/termux/termux-app/releases/download/v0.119.0-beta.1/termux-app_v0.119.0-beta.1apt-android-5-github-debug_arm64-v8a.apk 安装ssh(非必要) pkg install open…...

Springboot jar包加密加固并进行机器绑定

获取机器码&#xff0c;通过classfinal-fatjar-1.2.1.jar来获取机器码 命令&#xff1a;java -jar classfinal-fatjar-1.2.1.jar -C 对springboot打包的jar进行加密功能 java -jar classfinal-fatjar-1.2.1.jar -file lakers-ljxny-3.0.0.jar -packages com.lygmanager.laker…...

【Microi吾码】开源力量赋能低代码创新,重塑软件开发生态格局

我的个人主页 文章专栏&#xff1a;Microi吾码 一、引言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;软件开发的需求呈现出爆发式增长。企业为了在激烈的市场竞争中脱颖而出&#xff0c;不断寻求创新的解决方案以加速数字化转型。传统的软件开发方式往往面临着开发周期长、技…...

系统思考—冰山模型

“卓越不是因机遇而生&#xff0c;而是智慧的选择与用心的承诺。”—— 亚里士多德 卓越&#xff0c;从来不是一次性行为&#xff0c;而是一种习惯。正如我们在日常辅导中常提醒自己&#xff1a;行为的背后&#xff0c;隐藏着选择的逻辑&#xff0c;而选择的根源&#xff0c;源…...

Java读取InfluxDB数据库的方法

本文介绍基于Java语言&#xff0c;读取InfluxDB数据库的方法&#xff0c;包括读取InfluxDB的所有数据库&#xff0c;以及指定数据库中的measurement、field、tag等。 首先&#xff0c;创建一个Java项目&#xff0c;用于撰写代码。如果大家是基于IDEA来创建项目&#xff0c;则可…...

【mybatis-plus问题集锦系列】在mybatisplus中无法autowired的原因排查及解决

mybatisplus简化了我们做数据操作&#xff0c;大大提升了我们的开发速度&#xff0c;但是今天在做测试的时候&#xff0c;突然报了这么个错误&#xff0c;排查好久才找到解决方案&#xff0c;特此记录下 问题复现 这里的测试方法报错&#xff0c;通过不了测试 org.springf…...

python中Windows系统使用 pywin32 来复制图像到剪贴板,并使用 Selenium 模拟 Ctrl+V 操作

步骤 1&#xff1a;安装必要的库 首先&#xff0c;安装 pywin32 和 selenium&#xff1a; pip install pywin32 selenium 如果使用的是 macOS&#xff0c;可以安装 pyobjc&#xff1a; pip install pyobjc 步骤 2&#xff1a;使用 pywin32 复制图像到剪贴板 在 Windows 系统中…...

uniapp——微信小程序,从客户端会话选择文件

微信小程序选择文件 文章目录 微信小程序选择文件效果图选择文件返回数据格式 API文档&#xff1a; chooseMessageFile 微信小程序读取文件&#xff0c;请查看 效果图 选择文件 /*** description 从客户端会话选择文件* returns {String} 文件路径*/ const chooseFile () &g…...

点亮核心板小灯 STM32U575

将核心板上的运行状态指示灯点亮 任务分析 灯如何点亮 如何看开发板原理图 开发板上的灯硬件组成 原理图 原理图&#xff08;Schematic Diagram&#xff09;&#xff0c;也称为电路图或电气图&#xff0c;是一种图形表示方法&#xff0c;用于展示电子系统或电路的工作原理和…...

“图书馆服务自动化”:基于SSM框架的图书借阅系统开发

3.1系统的需求分析 需求分析阶段是设计系统功能模块的总方向&#xff0c;可以这样来说&#xff0c;系统的整个的开发流程以及设计进度&#xff0c;基本上都是以需求分析为基本依据的[10]。需求分析阶段可以确定系统的基本功能设计&#xff0c;以及在最后的系统验收阶段&#xf…...

顶顶通呼叫中心中间件的三种呼叫方式(mod_cti基于FreeSWITCH)

顶顶通呼叫中心共有三种呼叫方式&#xff1a; 手拨呼叫点击呼叫自动外呼 联系我们 有意向了解呼叫中心中间件的用户&#xff0c;可以点击该链接添加工作人员&#xff1a;https://blog.csdn.net/H4_9Y/article/details/136148229 手拨呼叫 手拨呼叫属于常规的呼叫方式&…...

HCIA笔记9--NAT、ACL与链路聚合

1. ACL ACL: 访问控制列表, Access Control List。 通过定义规则来允许或拒绝流量的通过。 1.1 ACL分类 1.2 配置实例 如图所示&#xff0c;对R2的访问只允许192.168.1.0/24网段。 我们可以配置基本acl来限制 acl 2000 acl number 2000 rule 5 permit source 192.168.1.0 0…...

【笔记】在虚拟机中通过apache2给一个主机上配置多个web服务器

&#xff08;配置出来的web服务器又叫虚拟主机……&#xff09; 下载apache2 sudo apt update sudo apt install apache2 &#xff08;一&#xff09;ip相同 web端口不同的web服务器 进入 /var/www/html 创建站点一和站点二的目录文件&#xff08;目录文件名自定义哈&#x…...

“校园健康数据管理”:疫情管控系统的信息收集与分析

3.1可行性分析 通过对系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1 技术可行性 1.硬件可行性分析 校园疫情管控系统系统的硬件要求方面不存在特殊的要求&#xff0c…...

MySQL 中存储金额数据一般使用什么数据类型

在 MySQL 中存储金额数据时&#xff0c;应该谨慎选择数据类型&#xff0c;以确保数据的精度和安全性。以下是几种常用的数据类型及其适用性&#xff1a; DECIMAL 类型&#xff1a; 描述&#xff1a;DECIMAL 类型是专门为存储精确的小数而设计的。它可以指定小数点前后的数字位数…...

使用 .NET 6 或 .NET 8 上传大文件

如果您正在使用 .NET 6&#xff0c;并且它拒绝上传大文件&#xff0c;那么本文适合您。 我分享了一些处理大文件时需要牢记的建议&#xff0c;以及如何根据我们的需求配置我们的服务&#xff0c;并提供无限制的服务。 本文与 https://blog.csdn.net/hefeng_aspnet/arti…...

帝国cms电脑pc站url跳转到手机站url的方法

本文讲解一下帝国cms电脑网站跳转到手机动态网站和手机静态网站的方法,笔者以古诗词网 www.gushichi.com为例&#xff0c;为大家介绍操作步骤。方法一&#xff1a;帝国pc站跳转到手机静态站 1、假设我们有帝国cms 电脑网站www.XXX.com&#xff0c;手机网站m.XXX.com &#xf…...

D类音频应用EMI管理

1、前言 对于EMI&#xff0c;首先需要理解天线。频率和波长之间的关系&#xff0c;如下图所示。   作为有效天线所需的最短长度是λ/4。在空气中&#xff0c;介电常数是1&#xff0c;但是在FR4或玻璃环氧PCB的情况下&#xff0c;介电常数大约4.8。这种效应会导致信号在FR4材…...

【行业发展报告】2024大数据与智能化行业发展浅析

回首 2024&#xff0c;大数据智能化浪潮汹涌。海量数据宛如繁星&#xff0c;在智能算法的苍穹下汇聚、碰撞&#xff0c;释放出洞察市场与用户的强大能量&#xff0c;精准勾勒出商业新航线。我们精心雕琢技术架构&#xff0c;从数据存储的坚固基石到处理分析的高效引擎&#xff…...

闲谭Scala(3)--使用IDEA开发Scala

1. 背景 广阔天地、大有作为的青年&#xff0c;怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上&#xff0c;提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA&#xff0c;依次File-New-Project…&#xff0c;不好意思我的是中文版&#xff1a;…...

系统压力测试助手——stress-ng

1、背景 在系统性能测试和压力测试中&#xff0c;stress-ng 是一个非常强大的工具&#xff0c;广泛应用于对 Linux 系统进行各种硬件和软件方面的负载测试。它能够模拟多种极端负载情况&#xff0c;帮助开发人员和运维人员检查系统在高负载下的表现&#xff0c;以便发现潜在的…...

FFmpeg推拉流命令

命令简介 它可以将本地的视频/音频流推送到服务器&#xff0c;也可以将服务器上的音视频流拉到本地。 推流命令的命令格式 ffmpeg -re -i [输入文件] -c:v [视频编码器] -c:a [音频编码器] -f [输出格式] [推流地址] 参数解析 -re 表示采用实时模式&#xff0c;以原始速度…...

【Spring】基于注解的Spring容器配置—— @Component及其衍生注解

Spring框架因其灵活性和强大的功能被广泛应用于企业级应用的开发中。Spring提供了一种基于IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;的编程模型&#xff0c;使得开发者能够以更简单和高效的方式管理应用程序的对象及其依赖关系。 在Spri…...

基于统计分析与随机森林的环境条件对生菜生长的影响研究

1.项目背景 随着现代农业的发展&#xff0c;对植物生长过程中环境因素的影响有了越来越多的关注&#xff0c;基于2023年8月3日至2023年9月19日期间记录的70个不同生菜样本的生长数据进行分析&#xff0c;可以更好地理解温度、湿度、pH值和总溶解固体&#xff08;TDS&#xff0…...

基于PyQt5的UI界面开发——多界面切换

介绍 最初&#xff0c;因为课设的缘故&#xff0c;我只是想做一个通过按键进行切面切换而已&#xff0c;但是我看网上资料里面仅是语焉不详&#xff0c;让我困惑的很&#xff0c;但后面我通过摸索才发现这件事实在是太简单了&#xff0c;因此我想要记录下来。 本博客将介绍如…...

C语言-结构体内存大小

#include <stdio.h> #include <string.h> struct S1 { char a;//1 int b;//4 char c;//1 }; //分析 默认对齐数 成员对齐数 对齐数(前两个最小值) 最大对齐数 // 8 1 …...

搭建vue项目

一、环境准备 1、安装node node官网&#xff1a;https://nodejs.org/zh-cn 1.1、打开官网&#xff0c;选择“下载”。 1.2、选择版本号&#xff0c;选择系统&#xff0c;根据需要自行选择&#xff0c;上面是命令安装方式&#xff0c;下载是下载安装包。 1.3、检查node安装…...

【每日学点鸿蒙知识】Text填充父控件、Native接收数组、js逻辑不执行问题、UIAbility上下文问题、页面跳转路由栈

1、HarmonyOS 如何使Text组件填充满父组件&#xff1f; build() {Row() {Row() {Text(this.str).constraintSize({ maxWidth: 100%, minHeight: "30vp" }).backgroundColor(Color.Gray).fontSize(24vp)}.key(row1).constraintSize({ maxWidth: 100%}).backgroundCol…...

Debian-linux运维-ssh配置(兼容Jenkins插件的ssh连接公钥类型)

系统版本&#xff1a;Debian 12.5、11.1 1 生成密钥对 可以用云服务商控制台生成的密钥对&#xff0c;也可以自己在客户端或者服务器上生成&#xff0c; 已经有密钥对就可以跳过这步 用户默认密钥文件路径为 ~/.ssh/id_rsa&#xff0c;可以在交互中指定路径&#xff0c;也可…...

37. socketserver模块

一、socketserver模块 SocketServer 是标准库中的一个高级模块&#xff0c;它的目标是简化很多样板代码&#xff0c;它们是创建网络客户端和服务器所必须的代码。这个模块中有为你创建的各种各样的类。 类描述BaseServer包含核心服务器功能和 min-in 类的钩子&#xff1b;仅用…...

【详细讲解】hive优化

1、开启本地模式 大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过&#xff0c;有时Hive的输入数据量是非常小的。在这种情况下&#xff0c;为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况&#xff0c;Hive可…...

芝法酱学习笔记(2.3)——shardingsphere分库分表

一、前言 之前的例子中&#xff0c;我们以一个简化了的销售单报表查询&#xff0c;展示了大数据量查询时&#xff0c;在索引和变量类型层面可以做的一些优化。可我们发现&#xff0c;无论怎么优化&#xff0c;一次查询都要好几秒。 这是一个现实问题&#xff0c;只要一个系统用…...

【超简单】Python入门实用教程

Python 入门教程 1 ---- Python Syntax Python是一个高效的语言&#xff0c;读和写的操作都是很简单的&#xff0c;就像普通的英语一样 Python是一个解释执行的语言&#xff0c;我们不需要去编译&#xff0c;我们只要写出代码即可运行 Python是一个面向对象的语言&#xff0c;…...

c语言中void关键字的含义和用法

在 C 语言中&#xff0c;void 是一个特殊的关键字&#xff0c;主要有以下几个用途&#xff1a; 1. 表示函数没有返回值 当一个函数不需要返回任何值时&#xff0c;可以将其返回类型声明为 void。 #include <stdio.h>void printMessage() {printf("Hello, World!\…...

数据库课程设计-工资管理系统-MySQL

目录 第一节 需求分析 1.1 需求分析概述 1.2 功能需求分析 1.2.1 人事数据管理模块 1.2.2 考勤数据管理模块 1.2.3 工资数据管理模块 1.2.4 工资计算公式设置模块 1.3 数据需求分析 1.3.1 数据项定义 1.3.2 数据结构定义 第二节 概念结构设计 2.1 分E-R图 ?2.2 基…...

基于 DINOv2 模型实现图搜图相似度检索任务

一、DINOv2 模型简介及使用 DINOv2是由Meta AI开发的第二代自监督视觉变换器模型&#xff0c;采用 Vision Transformer (ViT) 架构 。其核心特点是在无需人工标签的情况下&#xff0c;通过自监督学习技术&#xff0c;从海量无标注图像中学习有意义的视觉特征表示&#xff0c;类…...

Excel将混乱的多行做成1列

目标是将数据按从左到右&#xff0c;再从上到下排成一列。 公式法 首先用textjoin函数将文本包起来&#xff0c;做成一个超长文本。 然后用公式 截取文本 Mid(m1,n,3)&#xff0c;意思就是对m1单元格&#xff0c;从第n个字符开始&#xff0c;截取3个字符出来。 这个公式如何自…...

2021.12.28基于UDP同信的相关流程

作业 1、将TCP的CS模型再敲一遍 服务器 #include <myhead.h> #define PORT 8888 #define IP "192.168.124.123" int main(int argc, const char *argv[]) {//创建套接字//绑定本机IP和端口号//监听客户端请求//接收客户端连接请求//收发消息//创建套接字int…...

DevOps工程技术价值流:Ansible自动化与Semaphore集成

在DevOps的浪潮中&#xff0c;自动化运维工具扮演着举足轻重的角色。Ansible&#xff0c;作为一款新兴的自动化运维工具&#xff0c;凭借其强大的功能和灵活性&#xff0c;在运维领域迅速崭露头角。本文将深入探讨Ansible的特点、架构、工作原理&#xff0c;以及其应用场景&…...

【 Git 设置代理】

【 Git 设置代理】 1. 设置代理2. 检查当前 Git 代理3. 测试代理是否正常4. 查看Git所有配置5. 取消添加的代理 1. 设置代理 添加 HTTP 和 HTTPS 代理&#xff1a; git config --global http.proxy http://127.0.0.1:10809 git config --global https.proxy http://127.0.0.1…...

使用 HTML 和 CSS 实现绚丽的节日烟花效果

文章目录 1. 效果预览2. 核心技术栈3. 核心代码解读3.1 HTML结构3.2 霓虹文字的CSS样式3.2.1 核心样式代码3.2.2 动画效果 3.3 JavaScript 的烟花效果实现3.3.1 烟花上升3.3.2 粒子爆炸 4. 用户交互5. 运行步骤总结 1. 效果预览 打开后输入文本的展示内容 用户点击页面后播放…...

Java - 日志体系_Apache Commons Logging(JCL)日志接口库_适配Log4j2 及 源码分析

文章目录 PreApache CommonsApache Commons ProperLogging &#xff08;Apache Commons Logging &#xff09; JCL 集成Log4j2添加 Maven 依赖配置 Log4j2验证集成 源码分析1. Log4j-jcl 的背景2. log4j-jcl 的工作原理2.1 替换默认的 LogFactoryImpl2.2 LogFactoryImpl 的实现…...

【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)

1. 开发需求 在参考图像中定义感兴趣区域&#xff08;ROI&#xff09;&#xff0c;用于形状匹配和文本识别。通过形状匹配找到图像中的目标对象位置。对齐多幅输入图像&#xff0c;使其与参考图像保持一致。在对齐后的图像上进行OCR识别&#xff0c;提取文本和数字信息。以循环…...

FreePBX修改IP地址和端口以及添加SSL证书开启HTTPS访问

最近给单位部署了freepbx网络电话系统&#xff0c;我的系统是安装在ibm x3650 m4物理机上的&#xff0c;iso镜像下载后直接用Rufus烧录到U盘&#xff0c;服务器上先做好了raid1&#xff0c;插上U盘重启服务器开撸。安装过程略过了&#xff0c;在虚拟机上安装就不用那么麻烦。 …...