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

Linux网络_应用层自定义协议与序列化_守护进程

一.协议

协议是一种 "约定". socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接 收的. 如果我们要传输一些 "结构化的数据" 怎么办呢? 其实,协议就是双方约定好的结构化的数据

像下面,两端都知道数据结构data的结构,我们可以直接传data数据的二进制吗?

理论可以,但如果两边平台不同,不兼容等导致出错。

eg.大小端问题 64位指针大小8 32位指针大小4

所以我们一般不通过二进制协议进行传输

所以我们一个怎么处理更复杂的、结构化的数据的传输呢?

二.序列化和反序列化

1.什么是序列化 反序列化

比如说我们传一个结构体data,里面包含 int x,char oper ,int y。

我们不要一个一个传,可以把成员元素整合成一个字符串,再传。这个就是序列化

但当我们获取到了这个字符串,怎么获取到里面包含的消息呢?

我们可以自己进行规定,每个元素间用空格进行隔开,依次进行获取。

根据制定的规则进行解包,获取元素,就是反序列化。

序列化: 你将结构体的各个成员转换成某种格式的字符串,以便传输或存储。例如,使用空格分隔成员。
反序列化: 接收端根据预定的规则解析字符串,并将其恢复为原始数据结构(结构体、对象等)。

2.JSON 序列化

Jsoncpp 是一个用于处理 JSON 数据的 C++ 库。它提供了将 JSON 数据序列化为字
符串以及从字符串反序列化为 C++ 数据结构的功能。Jsoncpp 是开源的,广泛用于各
种需要处理 JSON 数据的 C++ 项目中。

序列化方法:

1.使用 Json::Value 的 toStyledString 序列化:

优点:将 Json::Value 对象直接转换为格式化的 JSON 字符串

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
int main()
{Json::Value root;root["name"] = "joe";root["sex"] = "男";std::string s = root.toStyledString();std::cout << s << std::endl;return 0;
}
$ . / test.exe
{
"name" : "joe",
"sex" : "男"
}

2.使用 Json::StreamWriter:

优点:提供了更多的定制选项,如缩进、换行符等。

#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>
int main()
{Json::Value root;root["name"] = "joe";root["sex"] = "男";Json::StreamWriterBuilder wbuilder; // StreamWriter 的工厂std::unique_ptr<Json::StreamWriter> writer(wbuilder.newStreamWriter());std::stringstream ss;writer->write(root, &ss);std::cout << ss.str() << std::endl;return 0;
}
$ . / test.exe
{
"name" : "joe",
"sex" : "男"
}

3.使用 Json::FastWriter:

比 StyledWriter 更快,因为它不添加额外的空格和换行符。

#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>
int main()
{Json::Value root;root["name"] = "joe";root["sex"] = "男";Json::FastWriter writer;std::string s = writer.write(root);std::cout << s << std::endl;return 0;
}
$ . / test.exe
{ "name":"joe","sex" : "男" }#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>
int main()
{Json::Value root;root["name"] = "joe";root["sex"] = "男";// Json::FastWriter writer;Json::StyledWriter writer;std::string s = writer.write(root);std::cout << s << std::endl;return 0;
}
$ . / test.exe
{
"name" : "joe",
"sex" : "男"
}

反序列化方法:

使用 Json::Reader:

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
int main() {// JSON 字符串std::string json_string = "{\"name\":\"张三\",\"age\":30, \"city\":\"北京\"}";// 解析 JSON 字符串Json::Reader reader;Json::Value root;// 从字符串中读取 JSON 数据             序列化的字符串 进行反序列bool parsingSuccessful = reader.parse(json_string,root);if (!parsingSuccessful) {// 解析失败,输出错误信息std::cout << "Failed to parse JSON: " <<reader.getFormattedErrorMessages() << std::endl;return 1;}// 访问 JSON 数据std::string name = root["name"].asString();int age = root["age"].asInt();std::string city = root["city"].asString();// 输出结果std::cout << "Name: " << name << std::endl;std::cout << "Age: " << age << std::endl;std::cout << "City: " << city << std::endl;return 0;
}
$ . / test.exe
Name : 张三
Age : 30
City : 北京

访问 JSON 数据,int age = root["age"].asInt(); 如果是char c=root["age"].asInt(),也是用.asInt,没有.aschar。因为char类型就是整数

三.重新理解 read、write、recv、send 和 tcp 为什么支持全双工

全双工:通信双方可以同时进行双向数据传输。也就是说,发送和接收可以在同一时刻发生。

在任何一台主机上,TCP 连接既有发送缓冲区,又有接受缓冲区,所以,在内核
中,可以在发消息的同时,也可以收消息,即全双工。
这就是为什么一个 tcp sockfd 读写都是它的原因。
实际数据什么时候发,发多少,出错了怎么办,由 TCP 控制,所以 TCP 叫做传输控制协议。

在系统内部都有大量的报文,一部分是从发送缓冲区进行传输,另一部分是向接收缓冲区进行传输。如何进行管理,先描述,再组织。每个报头间用链表进行连接。

在socket结构中就包含两个队列,分别是发送队列,接收队列,对这两部份报头进行管理。

这两个队列分别用于存储发送和接收的报文头。每个队列可以通过链表来管理报文的顺序。

发送缓冲区和发送队列:发送缓冲区的内容一般是按照队列的顺序被处理的。数据首先进入发送队列(即缓冲区),然后按顺序被发送到远程主机。在TCP协议中,发送队列不仅仅是一个简单的队列,还会涉及到流量控制、拥塞控制等机制,确保发送方的速度不会超过接收方的处理能力。
接收缓冲区和接收队列:当数据到达本地系统时,接收队列会存放这些数据。接收队列的顺序和缓冲区管理相结合,确保应用程序能够以正确的顺序读取到接收到的数据。

四.ps axj 当前系统的进程信息

   PID  PGID   SID TTY      TIME CMD123  123    123 tty1     00:00:01 bash234  123    123 tty1     00:00:00 ps567  567    567 ?        00:00:10 my_process

PID(进程ID):进程的唯一标识符。
PGID(进程组ID):多个进程共享的组ID。(处在同一组的进程PGID相同,一般第一个是组长)
SID(会话ID):进程所属的会话ID。
TTY(终端):进程关联的终端(如果有)。
TIME(CPU时间):进程使用的CPU时间。
CMD:启动该进程的命令。

五.守护进程

1.前台进程 后台进程

像在命令行中直接sleep 100 启动的就是前台进程,如果在后面加& ,sleep 100 &就把这个进程在后台启动。

启动一个前台进程(例如,运行 sleep 100),该进程会占用终端。前台进程会占据整个终端的输入/输出流,因此你无法在命令行中执行其他命令(如 ls)直到这个前台进程完成。

2.fd 任务号 后台进程->前台进程

当我们启动了一个后台进程,怎么再把它放到前台呢?

fd+任务号

使用 jobs 命令可以列出当前 shell 会话中所有的后台任务,并显示每个任务的任务号(Job ID)和当前状态。

3.Ctrl+Z bg 任务号 前台进程->后台进程

1.ctrl+z 挂起前台进程,变为暂停状态。

2.bg+任务号 将挂起的进程放到后台,不能直接把前台进程放在后台。

4.后台进程和守护进程

当我们进行登录,系统会创建一个会话,这个会话中bash进程当作前台进程,与终端直接连接,建立后台进程不会直接接收用户的输入,也不会直接向终端输出数据,一般不输入输出重定向到其它文件。

如果我们退出登录,该会话的前台进程 终端都会关闭,里面的后台进程也会受到影响。

有没有办法退出时让该后端进程不受影响?

把该后端进程放到一个新的会话中,并且持续运行,不与任何终端关联,就是守护进程。

如何创建守护进程?

手动:

1.调用 fork():首先,进程调用 fork() 创建一个子进程,父进程退出,确保子进程不成为孤儿进程。
2.调用 setsid():子进程通过 setsid() 调用成为新会话的会话领导者,这样它就不再与控制终端关联。(不是是进程组的组长调用它。fork()子进程调用)
3.重定向输入输出:守护进程会将输入输出重定向到日志文件或 /dev/null (文件黑洞 不会保存数据),以确保不会干扰终端。
4.持续运行:守护进程通常进入无限循环,保持持续运行,处理后台任务。

#pragma once#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define ROOT "/"
#define devnull "/dev/null"void Daemon(bool ischdir, bool isclose)
{// 1. 守护进程一般要屏蔽到特定的异常信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 成为非组长if (fork() > 0)exit(0);// 3. 建立新会话setsid();// 4. 每一个进程都有自己的CWD,是否将当前进程的CWD更改成为 / 根目录if (ischdir)chdir(ROOT);// 5. 已经变成守护进程啦,不需要和用户的输入输出,错误进行关联了if (isclose){::close(0);::close(1);::close(2);}else{int fd = ::open(devnull, O_WRONLY);if (fd > 0){// 各种重定向dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}
}

daemon:

int daemon(int nochdir, int noclose);

nochdir:如果为 1,守护进程将不改变当前工作目录;如果为 0,守护进程会将当前工作目录更改为根目录(/),以避免占用一个文件系统的目录。
noclose:如果为 1,守护进程不会关闭文件描述符。如果为 0,守护进程会关闭标准输入、标准输出和标准错误输出文件描述符。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {// 将进程转变为守护进程if (daemon(0, 0) == -1) {perror("daemon");exit(1);}// 守护进程的工作while (1) {// 这里可以添加守护进程执行的任务sleep(10);  // 每10秒执行一次任务}return 0;
}

在原会话的后台进程会受到终端信号干扰、父进程退出以及会话管理的影响。

通过使用 setsid() 来创建新的会话,守护进程能够脱离终端和父进程的控制,确保在系统后台独立稳定地运行,避免受到干扰。

守护进程处于新的会话:

1.确保进程不被终端信号干扰

在原有会话中运行的进程通常会收到一些终端信号,尤其是当用户退出时,例如 SIGHUP 信号,通常会导致进程终止。守护进程必须避免这些信号的干扰,才能保证其在系统后台长时间稳定运行。

调用 setsid() 后,守护进程会脱离原会话,并成为一个新的会话的会话领导者,控制终端不再影响它。这确保了守护进程不会因为终端的关闭或会话的结束而被中断。

2.防止守护进程成为孤儿进程

在操作系统中,进程分为父进程和子进程。如果一个进程的父进程终止,该进程会被操作系统的 "init" 进程收养,成为孤儿进程。然而,守护进程希望在系统后台长期运行,它不希望被父进程或任何其他进程“收养”,而是希望有完全的独立性。

通过调用 setsid(),守护进程脱离了原会话,成为一个新的会话的会话领导者,这样它不再依赖任何父进程,确保它不会成为孤儿进程,也不会因为父进程的退出而终止。

相关文章:

Linux网络_应用层自定义协议与序列化_守护进程

一.协议 协议是一种 "约定". socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接 收的. 如果我们要传输一些 "结构化的数据" 怎么办呢? 其实&#xff0c;协议就是双方约定好的结构化的数据 像下面&#xff0c;两端都知道数据结构…...

c++领域展开第十五幕——STL(String类的模拟实现)超详细!!!!

文章目录 前言string类的模拟实现string类——迭代器的模拟string类——默认成员函数string类——常用函数接口string类——输入输出重载 总结 前言 上篇博客已经简单的介绍了string类的一些接口&#xff0c;并且做了一些了解 同时也刷了一些oj题目&#xff0c;熟练使用一些str…...

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域&#xff0c;Node.js 凭借其事件驱动、非阻塞 I/O 的模型&#xff0c;在构建高性能、可扩展的网络应用方面展现出独特的优势 &#xff0c;受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端&#xff0c;还能在服务器端大展身手&…...

2024华为OD机试真题-螺旋数字矩阵-(C++)-E卷D卷-100分

2024华为OD机试题库-(E卷+C卷+D卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 用例3 考点 解题思路 代码 c++ 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数 n (0 < n ≤ 999)和行数 …...

记录若依分离版脚手架升级 springboot 3.X版本 中的报错 以及集成mybatis plus

问题一&#xff1a; Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.移除父pom中的tomcat相关配置 子pom中增加 SpringBoot Web容器 <!-- SpringBoot Web容器 …...

Docker基础-常见命令与数据卷

(一)常见命令 一、Docker常见命令 使用 docker pull 用来拉取仓库的镜像文件到本地&#xff1b;docker images 用于查看镜像文件&#xff1b;docker rmi 用于删除镜像文件docker build 用于自定义镜像&#xff0c;将来自己写的java项目也是通过这种方式来构建和打包&#xff1…...

C++基础(16 智能指针)

目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4. 智能指针的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循环引用问题 5.2 weak_ptr 如何检测内存泄漏&#xff08;了解&#xff09; 1. 智能指针的使用场景分析 下⾯程序中我…...

蓝耘智算携手通义万相2.1:助力 AIGC 生成效率与性能的革新实践

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…...

嵌入式学习-EXTI外部中断

STM32 是一种基于 ARM Cortex-M 内核的微控制器系列&#xff0c;广泛应用于嵌入式系统开发。中断&#xff08;Interrupt&#xff09;是 STM32 中一个非常重要的功能&#xff0c;它允许微控制器在执行主程序的同时&#xff0c;响应外部事件或内部事件的请求&#xff0c;从而实现…...

git 中 commit 的修改

修改最新的commit 1. 通过文本编辑器修改 # 修改最后一次提交的提交信息 git commit --amend2. 通过命令行修改 git commit --amend -m "新的提交信息"3. 仅添加遗漏的文件 # 添加遗漏的文件到暂存区 git add 遗漏的文件路径 # 修改最后一次提交&#xff0c;将暂…...

视觉Transformer(ViT)解析:它们比CNN更好吗?

深入理解计算机视觉任务中突破性架构的工作原理 1. 引言 自从自注意力机制&#xff08;Self-Attention Mechanism&#xff09;被引入以来&#xff0c;Transformer模型一直是自然语言处理&#xff08;NLP&#xff09;任务的首选。基于自注意力的模型具有高度并行化的特性&…...

rustup-init.exe 安装缓慢的解决办法

首先在rust官网下载安装程序&#xff0c;官网下载的 rustup-init.exe 下载慢&#xff0c;安装慢&#xff0c;或者直接卡死。 下载安装程序在本地&#xff0c;使用国内镜像加速 Rust 更新与下载。 使用国内镜像源&#xff1a;在 rustup-init.exe 程序文件夹下使用 PowerShell 中…...

动规【力扣】72. 编辑距离

数组含义&#xff1a; dp[i][j]含义是word1的i长度字符串和word2的j长度字符串所需的最少编辑距离。 递推公式&#xff1a; 1.当word1.charAt(i-1)word2.charAt(j-1)时&#xff0c;不用做任何操作&#xff0c;所以dp[i][j] dp[i-1][j-1]&#xff1b; 2.当word1.charAt(i-1)&a…...

获取哔站评论

一、文章立论 哔哩哔哩&#xff08;B站&#xff09;是当前年轻人十分喜爱的视频分享平台&#xff0c;以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上&#xff0c;用户不仅可以观看各种类型的视频&#xff0c;如动画、游戏、科技、生活、影…...

LeetCode 链表章节

简单 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2…...

JavaScript实现倒计时函数

函数代码 /*** 倒计时* param {function} callback 回调函数&#xff0c;参数为当前剩余时间(time)* param {number} count 倒计时开始时间(s)* param {number} interval 间隔时间(ms)*/ function countDown(callback, count 60, interval 1000) {callback(count);const sta…...

Spring Boot全局异常处理:“危机公关”团队

目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理&#xff08;附上代码实例&#xff09;三、总结&#xff1a; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1…...

Vue 调用摄像头扫描条码

以下是一个基于 Vue.js 的页面代码示例&#xff0c;用于调用摄像头并扫描条码。我们将使用 jsQR 库来解析二维码&#xff08;或条形码&#xff09;&#xff0c;这是一个轻量级的 JavaScript 库。 实现步骤&#xff1a; 安装依赖&#xff1a;需要引入 jsQR 库。调用摄像头&…...

springboot3.x下集成hsqldb数据库

springboot3.x下集成hsqldb数据库 本文使用目前最新的sringboot3.4.3 和HyperSQL 2.7.4演示 HSQLDB数据库简介 HSQLDB&#xff08;HyperSQL DataBase&#xff09;是一个开放源代码的JAVA数据库。 可以透过 jdbc driver 来存取, 支持 ANSI-92 标准的 SQL 语法, 而且他占的空…...

网络流算法: Edmonds-Karp算法

图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…...

ArcGIS Pro可见性分析:精通地形视线与视域分析

在地理信息系统&#xff08;GIS&#xff09;的广泛应用中&#xff0c;可见性分析作为一项关键技术&#xff0c;发挥着不可替代的作用。 无论是城市规划、环境监测&#xff0c;还是军事侦察、景观设计&#xff0c;可见性分析都能提供精确的数据支持&#xff0c;帮助我们更好地理…...

jenkens使用笔记

jenkens使用笔记 笔记使用版本是2.492.1 git仓库ssh证书配置 已开始配置一直不行&#xff0c;然后下载插件&#xff0c;多次重启等一些列操作&#xff0c; 后来配置就可以工作了&#xff0c;原因不祥&#xff0c;不知道哪个配置起效了。 等回来闹明白了&#xff0c;再补充笔记…...

解决跨域请求的问题(CORS)

目录 解决跨域请求问题的方法 1. 服务器端配置响应头 2. JSONP&#xff08;JSON with Padding&#xff09; 3. 代理服务器 场景示例 前端代码&#xff08;使用 Fetch API&#xff09; 后端代码&#xff08;使用 Node.js Express 并设置 CORS 响应头&#xff09; 跨域资…...

未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点?

未来经济范式争夺战&#xff1a;AR眼镜为何成为下一代交互终端的制高点&#xff1f; 在蒸汽机轰鸣的工业革命时代&#xff0c;煤炭、铁路、电报构建了第一个现代经济范式&#xff1b;互联网时代&#xff0c;电力、光纤、物流网络重构了全球经济版图。当前&#xff0c;我们正站…...

CentOS 7 安装Nginx-1.26.3

无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载&#xff1a; http://nginx.org/download/nginx-1.26.3.zipLinxu下载 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安装Nginx-1.26.3 安装之前先安装Nginx依赖包、自行选择 yum -y i…...

基于opencv消除图片马赛克

以下是一个基于Python的图片马赛克消除函数实现&#xff0c;结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务&#xff0c;建议根据实际需求选择合适的方法&#xff1a; import cv2 import numpy as np from PIL import Imagedef remove_mosaic(image_pat…...

MongoDB Compass中MONGOSH常用查询整理

MongoDB Compass中MONGOSH常用查询整理 选择数据库基本的查找指令find() 方法findOne() 方法 高级查询条件比较操作符逻辑操作符投影操作排序操作限制和跳过操作limit() 方法skip() 方法 正则表达式查询数组查询 MongoDB Compass 是一款可视化的 MongoDB 数据库管理工具&#x…...

SSM笔记

一、获取对象 Scop 单例在容器启动时就直接创建&#xff0c;如果不希望这样&#xff0c;那就使用Lazy懒加载&#xff0c;只能在单例模式下 3、4不常用 FactoryBean创建 对象 创建对象比较复杂时&#xff0c;可以实现创建一个类实现FactoryBean&#xff0c;实现3个方法来创建…...

5G学习笔记之BWP

我们只会经历一种人生&#xff0c;我们选择的人生。 参考&#xff1a;《5G NR标准》、《5G无线系统指南:如微见著&#xff0c;赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中&#xff0c;默认所有终端均能处理最大2…...

MongoDB Chunks核心概念与机制

1. 基础定义‌ ‌Chunk&#xff08;块&#xff09;‌&#xff1a;MongoDB分片集群中数据的逻辑存储单元&#xff0c;由一组连续的片键&#xff08;Shard Key&#xff09;范围数据组成&#xff0c;默认大小为‌64MB‌&#xff08;可调整范围为1-1024MB&#xff09;‌。‌数据分…...

el-table 手动选择展示列

需求&#xff1a; 由于表格的列过多,用滚动条进行滚动对比数据不方便&#xff0c;所以提出&#xff0c;手动选择展示列 实现思路&#xff1a; 表格默认展示所有字段&#xff0c;每个字段通过 v-if 属性来进行判断是否显示&#xff1b;点击设置按钮图标(表格右上角&#xff0…...

Netty笔记3:NIO编程

Netty笔记1&#xff1a;线程模型 Netty笔记2&#xff1a;零拷贝 Netty笔记3&#xff1a;NIO编程 Netty笔记4&#xff1a;Epoll Netty笔记5&#xff1a;Netty开发实例 Netty笔记6&#xff1a;Netty组件 Netty笔记7&#xff1a;ChannelPromise通知处理 Netty笔记8&#xf…...

LeetCode Hot 100

1.两数之和 暴力解法:时间/空间复杂度 O(N)&#xff0c;O(1) class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){if(nums[i] nums[j] target){return new int[]{i,j};}}}return new int[0];}…...

Vue.js 学习笔记

文章目录 前言一、Vue.js 基础概念1.1 Vue.js 简介1.2 Vue.js 的特点1.3 Vue.js 基础示例 二、Vue.js 常用指令2.1 双向数据绑定&#xff08;v-model&#xff09;2.2 条件渲染&#xff08;v-if 和 v-show&#xff09;2.3 列表渲染&#xff08;v-for&#xff09;2.4 事件处理&am…...

MySQL表连接详解

MySQL表连接详解 在 MySQL 中&#xff0c;表连接&#xff08;Join&#xff09;用于将多个表中的数据组合在一起&#xff0c;基于它们之间的关系进行查询。常见的表连接类型包括内连接、左连接、右连接和全外连接。以下是这些连接类型的详细说明&#xff1a; 1. 内连接&#x…...

【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理

ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类&#xff0c;基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展&#xff0c;支持更灵活的配置&#xff0c;并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...

PPT 小黑第38套

对应大猫40 幻灯片母板-最后一页-重命名为奇数页 奇偶页-点中标题-形状格式-形状填充-青色 最后一页页码左对齐 更换幻灯片背景&#xff1a;设计-设置背景格式-图片填充 【开始】-段落居中&#xff0c;对齐文本-中部对齐&#xff0c;排列-对齐-底端&#xff0c;-再水平居中…...

安卓开发相机功能

相机功能 安卓中的相机调用功能也经历了很多的方案升级&#xff0c;目前可选的官方方案是CameraX、Camera2、Camera&#xff08;废弃&#xff09;&#xff0c;还有一些第三方免费或者是付费的相机库。对于大多数开发者&#xff0c;建议使用 CameraX。 CameraX CameraX 是 An…...

宝塔找不到php扩展swoole,服务器编译安装

1. 在php7.4中安装swoole&#xff0c;但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题&#xff1b; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…...

Spring Web MVC

前言 今天来复习 Spring Web MVC 框架。它提供了一套高效、便捷的方式来构建 Web 应用程序。今天&#xff0c;就让我们一同深入 Spring Web MVC&#xff0c;从基础概念到实际应用&#xff0c;好好补补. 一、Spring Web MVC 是什么&#xff1f; 官方定义解读 根据官方描述&…...

蓝桥杯备考:动态规划线性dp之下楼梯问题进阶版

老规矩&#xff0c;按照dp题的顺序 step1 定义状态表达 f[i]表示到第i个台阶的方案数 step2:推导状态方程 step3:初始化 初始化要保证 1.数组不越界 2.推导结果正确 如图这种情况就越界了&#xff0c;我们如果把1到k的值全初始化也不现实&#xff0c;会增加程序的时间复杂度…...

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具&#xff0c;便于在客户端软件中…...

UDP透传程序

UDP透传程序 本脚本用于在 设备 A 和 设备 B 之间建立 UDP 数据转发桥梁&#xff0c;适用于 A 和 B 设备无法直接通信的情况。 流程&#xff1a; A --> 电脑 (中继) --> B B --> 电脑 (中继) --> A 需要修改参数&#xff1a; B_IP “192.168.1.123” # 设备 B 的…...

【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库

目录 Sionna&#xff1a;用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界&#xff01;”探索锡奥纳…...

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项

以下是修改后的完整文档&#xff0c;包含在多个多线程环境中使用 retain() 和 release() 方法的示例&#xff0c;且确保在 finally 块中调用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息载体&#xff0c;其中 getP…...

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中&#xff0c;查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句&#xff0c;可以获取指定表中的所有记录和列。例如&#xff0c;假设有一个名为employees的表&#xff0c;包含员工的基本信息&#xf…...

0005__PyTorch 教程

PyTorch 教程 | 菜鸟教程 离线包&#xff1a;torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...

高并发场景下的数据库优化

在高并发系统中&#xff0c;数据库通常是性能瓶颈。面对高并发请求&#xff0c;我们需要采用合适的优化策略&#xff0c;以保证数据库的稳定性和高效性。本文将介绍数据库高并发问题的成因&#xff0c;并结合 Mybatis-Plus&#xff0c;探讨 乐观锁、悲观锁、高并发优化及数据库…...

Linux:同步

目录 一、同步概念 条件变量 二、生产者消费者模型 三、环形队列 一、同步概念 互斥用来解决 访问临界资源 的非原子性&#xff0c;通俗来说&#xff0c;由于互斥锁的实现&#xff0c;保证了在用户角度看&#xff0c;同一个时间内访问临界资源的代码只有一个线程在执行。 而…...

GB28181开发--ZLMediaKit‌+WVP+Jessibuca‌

一、核心组件功能 1‌、ZLMediaKit‌ 定位‌:基于 C++11 的高性能流媒体服务框架,支持 RTSP/RTMP/HLS/HTTP-FLV 等协议互转,具备低延迟(最低 100ms)、高并发(单机 10W 级连接)特性,适用于商用级流媒体服务器部署‌。 ‌特性‌:跨平台(Linux/Windows/ARM 等)、支持 …...