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

TCP socket api详解

文章目录

    • netstat -nltp
    • accept
    • 简单客户端工具 telnet 指定服务连接
    • connect
    • 异常处理
      • version 1 单进程版
      • version 2 多进程版
      • version 3 -- 多线程版本
      • version 4 ---- 线程池版本

在这里插入图片描述

在这里插入图片描述
创建套接字socket + sockaddr_in结构体 + bind
之后就和UDP不一样了。
因为TCP是一个面向连接的服务器,在正式通信之前,他一定得随时随地等别人先和我连接上再说
也就是通信前得先建立连接,服务期就得一直想办法等别人来连。

第三个基本工作
listen
在这里插入图片描述

将套接字设置为监听状态,他才能随时听到有客户来连我了,然后我就可以帮我们把连接获取上来,然后基于连接再通信。
sockfd网络文件描述符
backlog 全连接队列 一般10不要设置的太大,后面讲tcp协议再谈。

netstat -nltp

n 显示数字
l listen状态
t tcp
p 进程
在这里插入图片描述
这里虽然tcpserver 绑定的是0.0.0.0 但是你客户端访问的时候是拿着公网ip去访问的,所以能找到。

accept

把服务器设置为listen状态完全不够,所以还要建立链接
在这里插入图片描述
返回值
成功,返回一个整数文件描述符,从你设置为监听状态的sockfd里面获取

所以tcp搞出多个文件描述符
在这里插入图片描述
accept返回又一个套接字,那我到底用哪个通信?

好再来鱼庄
一个门口的拉客服务员张三
张三不服务具体客人,他只是拉客
真正提供服务的是店内的李四

我们曾经的监听套接字,他的核心工作就是从底层把新连接获取上来
而提供IO数据通信服务的,是accept返回的fd。
监听套接字一般只有一个
accept返回值fd可以有多个

我们把经历过bind + listen的这个套接字 直接叫做listensock

在这里插入图片描述
如果listensock获取连接失败了,错误等级顶多也就是waning,然后直接continue继续获取连接
也就是张三拉客失败,你不去吃鱼,那 他就转头去找另一个小哥哥小姐姐问来不来吃鱼呀?
在这里插入图片描述
从上面到下面,我们讲的所有接口都是阻塞的。
也就是张三拉客路边根本没人,所以张三只能在那等着。
当然未来可以设置为非阻塞。

简单客户端工具 telnet 指定服务连接

127.0.0.1 本地换回 通过网络层从下往上 返回给本主机
telnet默认使用tcp协议
在这里插入图片描述
回车 ctrl+] quit
在这里插入图片描述

无论UDP and tcp ,云服务器的公网IP无法绑定进套接字

然后我就从accept返回的fd 通信呗
我还要获取从accpet返回给我哪一个客户端连接我的ip和端口信息
char ipstr[32]
4字节 转 点分十进制ip地址 需要多少空间?
点分十进制 四个区域,每个区域3个数字,就是12再加上三个点15,32是保守点
在这里插入图片描述
问题
不仅仅是IP和端口会发送到网络里,你做了大小端转化处理
那我们发过去的字符串消息 难道不做大小端转化吗?
也就是recvfrom sendto read write 这样的接口难道不用大小端转化吗
recvfrom sendto 读上来我也没见你转呀,最后通信也没问题
正常的通信内容,你所使用的接口会自动转化,只不过端口和ip很特殊,是要给OS的。
正常通信时不用操心大小端问题。

管道的读取 支持字节流能用read write
文件读取 也是支持字节流的 也直接read write
tcp 也是面向字节流的
所以读网络就像读取文件一样。
在这里插入图片描述
目前只处理正常的情况


tcp客户端

tcp客户端需不要bind?
一定要,但是不需要显示编码bind

为什么?
socket通信必须用ip+port 对于客户端来说保证唯一性就可以了,端口是几不重要。
由OS自动随机选择。

tcp这里什么时候自动绑定呢?

那我就打开网络文件描述符然后关闭它,在这之间我们tcp客户端需要干什么呢?
在这里插入图片描述

记住了,tcp是面向连接的,所以注定了客户端你得链接服务器,连接成功才能进行通信。客户端既然都不bind了,也就根本不存在listen,客户端也就不会让别人来连他,所以也就不会accept
客户端需要连别人,能向服务器发起连接的接口

connect

在这里插入图片描述
后两个参数和sendto是一毛一样的,意思是连接你是想向谁发起连接呢?
在这里插入图片描述
客户端发起connect的时候,进行自动随机bind
在这里插入图片描述
给谁发起连接,那就用命令行参数,你用户传我要连接哪个服务器ip+port
在这里插入图片描述
然后就是从文件描述符进行IO通信了
关于getline
会清空while循环外的string msg
在这里插入图片描述

异常处理

读写通信连接建立好,任何一方都可能出问题,服务器可能挂掉,客户端可能退出。
尤其对于服务器而言,如果客户端直接关闭自己连接怎么办?
客户端退了,服务端读取时会read返回0
返回0就跳出循环,service函数结束,关闭这个链接的描述符
在这里插入图片描述
read 返回值小于0 说明读取直接出错了 我们也让他break
在这里插入图片描述
而且获取新连接这件事是再死循环里面的,你关闭一个链接还能继续获取下一链接
在这里插入图片描述

如果服务器向已经关闭的套接字文件描述符写入时怎么办呢?
在这里插入图片描述
打游戏时,突然卡主不动了,当前你已掉线正在重连
这就是你的tcp客户端重新connnect
我们模拟一下


在这里插入图片描述
把早连上的客户端ctrl + c调之后下面的服务期就可以回显消息了。
在这里插入图片描述

为什么当前上面客户端可以发消息,下面的也不是发不了,只有上面退了下面才回显。

version 1 单进程版

这是因为目前为止我们是单进程版的服务,单进程版一旦进入service函数中只有给这个客户端服务完了执行流才会回到最开始,重新获取连接,重新进入服务函数提供服务。
在这里插入图片描述
在这里插入图片描述
你见过哪个服务器只能有一个客户服务,另一个客户你得等一等
这种服务器我们根本用不了。
就像餐厅里只有一张桌子。
所以今天

version 2 多进程版

每到一个新连接我们既想给新到的客户提供服务,提供服务期间还想让服务器继续处理其他对应的新连接,连接不断增多我也不怕。
在这里插入图片描述
fork创建子进程
子进程中执行服务函数,执行完了把fd关了,子进程也就退了
父进程呢就等待子进程,不等子进程会僵尸
这里有非常多的细节
文件描述符处理工作

  1. 文件描述符sockfd当前是不是父进程打开的文件描述符,会不会被子进程继承下去呢? 会的,父进程打开sockfd子进程能看到,子进程会和父进程虽然有两个不同的文件描述符表,子进程拷贝父进程Fd表,而子进程能看到父进程的sockfd,他连listensock也能看到,所以子进程不需要listensock直接关掉
    在这里插入图片描述
    在这里插入图片描述
    2. 先不考虑waitpid等待,因为这本身就不对 
    父进程他获取了新的套接字,他就回过头继续获取新连接了,他会重新获取文件描述符 ,可是你刚刚打开的sockfd已经被子进程继承下去了,这个sockfd指向打开的网络文件,那父进程还需要关心这个sockfd吗?
    相当于子进程和父进程看到的文件和Fd表都是一样的,只不过大家有不同的文件描述符表,此时子进程不关心listensock,他就关掉了。
    答:
    对父进程来讲,已经获取的新连接sockfd已经被子进程继承下去了,他就不需要了。
    父进程就把Sockfd关掉了。
    如果他不关,最后OS就可能有很多文件没有被关闭,最后就导致一些问题。
    .这和之前管道问题也是类似的。在这里插入图片描述
    在这里插入图片描述
    父进程每创建一个子进程就把sockfd交给子进程,由子进程全全负责给这个套接字提供服务。
    对于父进程必须要关掉曾经打开的fd,因为已经被子进程拿到了,不关导致父进程可用的Fd越用越少。

父进程把这个文件sockfd关闭了不会出问题吗,这个文件不会关闭吗?
父进程把他关了,这个文件不会被释放,因为文件struct file中包含引用计数,子进程还指向他呢。

我发现waitpid 为0 他是阻塞等待,子进程确实跑去执行服务了,可是父进程不是还在这里等待 吗,等你子进程执行完了退出了,我再继续获取连接accept。
这不和刚才单进程一样吗。
我想让父进程回到accept继续获取新连接,子进程继续服务,两个并发跑起来。
阻塞等待断然不能满足要求。
那我们把等待设置为非阻塞轮询,那也有点扯,非阻塞也可以,但不好
包括子进程退出会给父进程发信号,我们把等待工作放到信号处理中,这个也不想写。
所以两种做法。

  1. 子进程里面又继续fork创建了孙子进程,if(fork() >0) exit(0) 也就是子进程自己直接就退了,真正提供服务的是孙子进程
    因为子进程一启动创建立马退出,所以waitpid立马返回
    孙子进程提供服务的时候,waitpid已经回收了子进程的僵尸,然后waitpid返回直接继续accept
    有人就说,我们要不要等孙子进程呢?
    不用,你只要管好你儿子就行了。你儿子已经退出并且终止了,那你waitpid直接返回。
    所以孙子进程对他来讲,他的父进程直接就挂掉了,所以孙子进程会被系统领养,系统领养之后跟你有什么关系呢?
    孙子进程一旦把任务执行完了,这个孙子进程的资源就会被系统自动回收。
    在这份代码中,waitpid也要做,不然就会出现很多僵尸。

在这里插入图片描述
现象
我们每个人拿到的文件描述符都是4,这也很正常,因为3是listensock,获取一个新连接,就是4
你又关了然后继续获取还是4
我们能看到出了主进程其余都的子进程pid都是1,说明是孤儿进程。也就是被OS领养
在这里插入图片描述

  1. 其实我们可以不用等的,我们可以用signal将SIGCHLD的处理动作
    置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不 会产生僵尸进程,也不会通知父进程。
    在这里插入图片描述

客户来了新连接,我才忙着创建子进程呢这是其一

第二,来了连接,子进程会变得越来越多,我们其实比较难对他进行处理的。
我们也可以提前创建一批进程,但是进程池我们不谈,创建进程成本非常高,创建进程,创建地址空间,pcb,维护页表,初始化各种数据,还要做一大堆各种工作,创建进程成本很高,所以我们不愿意这样做。
这样多进程版的服务器也就满足小型应用。我们一核2G云服务顶天跑20个顶天了。所以我们不可能用这样的代码。我们不想使用这种版本。

version 3 – 多线程版本

在这里插入图片描述
创建线程,那我依然要等待新线程,还是在这里卡主,那accept也没有并发运行了。
此时新线程直接线程分离。因为主线程一直要获取新连接,创建出线程就不管了,让新线程跑去执行任务处理
在这里插入图片描述
第二个问题,
进程打开的所有文件描述符表,其他新创建出的线程能看见我曾经打开的listenscok,主线程获取到文件描述符新线程最终能不能通过文件描述符直接找到对应的文件呢?换句话说在线程这里要不要关闭不需要的文件描述符?

在线程当中,如果线程所在进程打开了一个文件,只要这个线程拿到对应的文件描述符,该线程直接可以访问这个文件,另外多线程这里完全不需要让多线程在关闭多余的文件描述符,因为他没有多余的。

答案是多线程这里不能关,一关就出大事了,线程大部分资源共享,比如文件描述符表。

为了让新线程提供服务,你要传文件描述符,你还需要客户端ip+port字段
那就打个结构体吧!
在这里插入图片描述
在这里插入图片描述
未来新线程负责套接字的整个生命周期
那Routine这样写能编过吗?
在这里插入图片描述
在这里插入图片描述

当前Routine必须是static的,因为类内函数自带的this指针与线程pthread_create的第三个形参类型不匹配
静态方法无法使用类内非static成员方法,也没有办法访问类内成员,因为他没有this指针。
那怎么办?
其实service函数和类内成员一点关系没有,你直接放到类外一样跑。
在这里插入图片描述

今天不想这么干
所以我们要把this指针传给新线程。
在这里插入图片描述
在这里插入图片描述
用this指针就可以访问类内非静态方法 了。
在这里插入图片描述
他比多进程好,创建的资源少。
可是每来一个客户都要创建新线程,那不会出问题吗?
客户不退,线程就越来越多,一般服务不是死循环,所以系统中不会维护太多线程,但是万一峰值情况,线程就会非常多,所以多线程版本也不适合应用于较大的应用。

来一个连接才给我创建线程,这也要花空间时间,我们这种情况登上就不退了,服务期就想办法提供一次服务。

所以

  1. 我们想预先创建好所有线程
  2. 我们不想提供长服务,否则提供短服务。
  3. 我们来了200个客户,每个客户都需要文件描述符,难道一定要有200个线程吗? 能不能限定线程个数的上限。
    每个用户访问,把访问变成对应任务,把任务交给后端。

version 4 ---- 线程池版本

相关文章:

TCP socket api详解

文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 创建套接字socket sockaddr_in结构体 bind 之后就和UDP不一样了。 因为TCP是一个面向连接的服务器&…...

Linux——环境变量

环境变量一般指的是在操作系统重用来指定操作系统运行环境的一些参数,这些参数会被bash使用,而bash是被我们用户使用的,也就是说,这些环境变量间接的也是被我们用户使用的。环境变量通常都有某些特殊的用途,它在系统重…...

Windows Pycharm 远程 Spark 开发 PySpark

一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接,连接虚拟机,选择项目目录即可远程开发...

【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解

vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为&#xff0…...

【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding

Isaac Sim对电脑配置要求很高,开机第一次打开 Isaac Sim 时,直接就报 Isaac Sim is not responding 卡死了,这是由于第一次需要加载一些资源,耗时会导致 Isaac Sim 无响应,这里等一会会自动给回复。 加载自带模型或示…...

React (三)

文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…...

C0031.在Clion中使用mingw编译器来编译opencv的配置方法

mingw编译器编译opencv库的配置方法...

多目标跟踪算法

文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…...

【CSS in Depth 2 精译_059】9.2 把 CSS 模块组合成更大的结构

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 ✔️ 9.2.1 模块中多个职责的…...

uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题

uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…...

shell(二)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?

一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换&#xff0c;将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说&#xff0c;PCA算法包括以下几个步骤&#xff1a…...

学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P1 ~ P2)

概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结&#xff0c;他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南&#xff0c;对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...

#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

开源POC库推荐

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…...

深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&…...

用vite下载的react + TS的项目,组件会调用两次

解决方案: 去掉main.tsx文件中的StrictMode...

STM32F4----DCA数字量转换成模拟量

STM32F4----DCA数字量转换成模拟量 基本原理 上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm1001.2014.3001.5501。这节讲DAC的原理和程序&#xff0c;在实际应用中&#xff0c;我们经常需要调节电压的输出大小&…...

springboot3如何集成knife4j 4.x版本及如何进行API注解

1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…...

【Linux网络 (二)】套接字编程

Linux: 网络 一、前言二、端口号 (port)1&#xff09;port、套接字概念2&#xff09;端口号 vs 进程id3&#xff09;端口号和进程关系 三、认识TCP/Udp协议1&#xff09;连接性解释2&#xff09;可靠性解释3&#xff09;面向数据报/字节流解释 四、网络字节序五、struct sockad…...

SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类&#xff1a;外连接&#xff08;细分为&#xff1a;左连接&#xff08;Left outer join/ left join&#xff09;、右连接&#xff08;right outer join/ right join&#xff09;、全连接&#xff08;full outer …...

3、集线器、交换机、路由器、ip的关系。

集线器、交换机、路由器三者的关系 1、集线器2、交换机&#xff08;每个交换机是不同的广播域&#xff0c;ip地址起到划分广播域的作用&#xff09;3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以&#xff0c;但是三台或者更多主机通信时&#xff0c;就需…...

OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…...

【论文笔记】LLaVA-KD: A Framework of Distilling Multimodal Large Language Models

Abstract 大语言模型(Large Language Models, LLM)的成功&#xff0c;使得研究者为了统一视觉和语言的理解去探索多模态大预言模型(Multimodal Large Language Models, MLLM)。 但是MLLM庞大的模型和复杂的计算使其很难应用在资源受限的环境&#xff0c;小型MLLM(s-MLLM)的表现…...

C++内存管理和模板

文章目录 1. C内存管理1.1 new1.1.1 内置类型1.1.2 自定义类型1.1.3 定位new表达式1.1.4 new的优势与不足1.1.5 new的原理 1.2 delete1.2.1 内置类型1.2.2 自定义类1.2.3 delete和free1.2.4 delete原理 1.3 new和delete的对应1.3.1 内置类型1.3.2 自定义类型 2. 模板2.1 函数模…...

Docker 容器化开发 应用

Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结...

element-plus教程:Input Number 数字输入框

一、基础用法 要使用Input Number数字输入框&#xff0c;只需要在<el-input-number>元素中使用v-model绑定变量即可。例如&#xff1a; <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...

【Go语言成长之路】编写web应用

文章目录 编写Web应用一、介绍二、创建项目2.1 创建wiki数据结构2.2 介绍net/http包&#xff08;小插曲&#xff09;2.3 使用 net/http 提供 wiki 页面2.4 编辑Pages2.5 html/template包2.6 处理不存在的页面2.7 保存页面2.8 错误处理2.9 模板缓存2.10 验证2.11 函数文字和闭包…...

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域&#xff1a; &#xff08;1&#xff09;对象头&#xff08;Mark Word、元数据指针和数组长度&#xff09; 对象头&#xff1a;在32位虚拟机中&#xff0c;1个机器码等于4字节&#xff0c;也就是32bit&#xff0c;在64位虚拟机中&#xff0…...

安宝特分享 | 如何利用AR技术革新医疗实践:从远程急救到多学科协作

AR技术在国内外医院的应用 在现代医疗环境中&#xff0c;患者面临的挑战依然严峻&#xff1a;看病难、看病远、看病急。这些问题不仅影响了患者的治疗效果&#xff0c;也让医务工作者倍感压力。幸运的是&#xff0c;随着增强现实&#xff08;AR&#xff09;技术的发展&#xf…...

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5&#xff0c;你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…...

vue2-基础核心

vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式&#xff0c;提高代码复用率&#xff0c;让代码更好维护 声明式编码&#xff0c;无需直接操作DOM&#xff0c;提高开发效率&#xff0c;编码简洁、体积小&#xff0c;运行效率高 本…...

使用 前端技术 创建 QR 码生成器 API1

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…...

天云数据参编行业标准|《Maas模型服务协议要求》标准正式发布

随着各行业对大模型的应用需求日益增多&#xff0c;模型即服务&#xff08;MaaS&#xff09;发展迅速&#xff0c;MaaS将AI模型以服务的方式提供给用户&#xff0c;降低模型使用门槛。当前产业界已推出诸多MaaS产品&#xff0c;并集成和提供了大量模型服务&#xff0c;然而对于…...

观察者模式和订阅模式

观察者模式和订阅模式在概念上是相似的&#xff0c;它们都涉及到一个对象&#xff08;通常称为“主题”或“发布者”&#xff09;和多个依赖对象&#xff08;称为“观察者”或“订阅者”&#xff09;之间的关系。然而&#xff0c;尽管它们有相似之处&#xff0c;但在某些方面也…...

Mac设置java环境变量

Mac电脑中存在多个jdk版本,如何配置java环境变量为指定版本jdk? 一、查看所有已安装的 JDK 版本 /usr/libexec/java_home -V二、临时设置 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)三、永久设置 如果需要永久使用指定版...

Sentinel服务保护

Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; home | Sentinel Sentinel 的使用可以分为两个部分: 核心库&#xff08;Jar包&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以…...

Linux内核USB2.0驱动框架分析--USB包

一&#xff0c; 包的组成 每个包都由SOP&#xff08;包起始域&#xff09;、SYNC&#xff08;同步域&#xff09;、Packet Content&#xff08;包内容&#xff09;、EOP&#xff08;包结束域&#xff09;四部分组成&#xff0c;其中SOP、SYNC、EOP为所有包共有的域&#xff0c…...

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…...

win10局域网加密共享设置

1、创建共享账户 我的电脑右键选择管理 选择本地用户和组 -> 用户 双击用户 在空白区域右键,新建用户 然后创建用户 点击创建后 2、设置网络 右下角网络右键...

论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)

文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况&#xff1a;理论与模拟C. 印刷偶极子的情况&#xff1a;电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/970…...

Docker Registry(镜像仓库)详解

Docker Registry&#xff08;镜像仓库&#xff09;详解 Docker Registry&#xff0c;即Docker镜像仓库&#xff0c;是Docker生态系统中一个至关重要的组件。它负责存储、管理和分发Docker镜像&#xff0c;为Docker容器提供镜像资源。本文将深入探讨Docker Registry的功能、结构…...

17. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--主币种设置

记账模块是我们项目的核心模块&#xff0c;也是用户使用最多的模块&#xff0c;因此这个模块的东西比较多&#xff0c;我们要分为多个部分编写代码。 一、需求 币种设置的需求涉及到了我们前面编写的代码&#xff0c;我们来具体看一下需求。 编号需求说明1主币种设置1. 用户…...

ChatPaper.ai:通过阅读文献高效学习英语的新思路

前言 作为一名学习者&#xff0c;我们常常会遇到这样的困境&#xff1a;想提高英语水平&#xff0c;但单纯背单词缺乏语境&#xff1b;想读专业文献&#xff0c;却被英语障碍所困扰。今天我要分享一个工具 ChatPaper.ai&#xff0c;它让我找到了将英语学习和专业阅读完美结合的…...

.NET9 - 新功能体验(二)

书接上回&#xff0c;我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中&#xff0c;引入的一项新的泛型约束功能&#xff0c;允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观&#xff0c;简单来说就是Span、ReadO…...

探索Python PDF处理的奥秘:pdfrw库揭秘

文章目录 探索Python PDF处理的奥秘&#xff1a;pdfrw库揭秘1. 背景&#xff1a;为何选择pdfrw&#xff1f;2. pdfrw是什么&#xff1f;3. 如何安装pdfrw&#xff1f;4. 五个简单的库函数使用方法4.1 读取PDF信息4.2 修改PDF元数据4.3 旋转PDF页面4.4 提取PDF中的图片4.5 合并P…...

网络爬虫——爬虫项目案例

本节将全面讲解如何通过实战爬虫项目解决复杂问题。结合最新技术和实际开发需求&#xff0c;案例将涵盖完整开发流程&#xff0c;包括需求分析、实现代码、优化方法和常见问题解决。力求实现高效、可扩展的爬虫项目架构&#xff0c;帮助开发者提升实战能力。 案例 1&#xff1a…...

JAVA中的Lamda表达式

JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性&#xff0c;用于简化代码&#xff0c;特别是在处理函数式编程时。Lambd…...

经典游戏:飞机大战游戏python设计与实现

《飞机大战》是一款经典的二维飞行射击游戏&#xff0c;其核心玩法是控制玩家飞机与敌机作战&#xff0c;通过击落敌机获取分数并尽量避免被敌机击中。根据提供的代码&#xff0c;飞机大战的设计和实现可以分为以下几个主要部分&#xff1a;游戏初始化、游戏界面设计、玩家控制…...

网络爬虫——常见问题与调试技巧

在开发网络爬虫的过程中&#xff0c;开发者常常会遇到各种问题&#xff0c;例如网页加载失败、数据提取错误、反爬机制限制等。以下内容将结合实际经验和技术方案&#xff0c;详细介绍解决常见错误的方法&#xff0c;以及如何高效调试和优化爬虫代码。 1. 爬虫过程中常见的错误…...