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

网络编程——套接字、创建服务器、创建客户端

一、套接字

1.1什么是套接字

套接字文件,原本就是一个和管道文件类似,用来实现进程间通信的一个文件

既然有了管道文件,当时为什么还要开发套接字文件,去实现进程的通信

因为管道文件是半双工模式的

套接字文件是全双工模式的

但是后来,有了OSI 7层模型以及TCP协议 4层模型之后

套接字文件就进化出了新的功能:

套接字文件中允许存放 ip 和 port 以实现数据的跨主机传输

原先只能实现进程间通信的套接字,就有了一个新的名字:域套接字

1.2 如何创建一个套接字文件:socket

函数原型:int socket(int domain, int type, int protocol);
功能描述:创建一个套接字文件,参数不同,功能类型就会不同
参数描述:参数 domain:网络介质,常用的有以下几种AF_UNIX,AF_LOCAL : 本地通信协议,其实就是给域套接字用的AF_INET:ipv4 地址协议AF_INET6:ipv6 地址协议最常用的就是: AF_INET参数 type:套接字类型,有以下2个常用类型SOCK_STREAM:提供一种有序的、可靠的、全双工的、基于连接的字节流套接字 这个描述一看就知道,tcp协议用的就是这种套接字SOCK_DGRAM:提供一种数据报文形式的,非连接的,不可靠的,发送的数据有最大长度限制的套接字这个描述一看就知道,udp协议使用的是这种套接字参数 protocol: 一般直接写0表示:网络通信协议会根据套接字的类型自动选取如果套接字类型为 SOCK_STREAM,protocol 为0,则自动选用tcp协议如果套接字类型为 SOCK_DGRAM,protocol 为0,则自动选用udp协议
返回值:成功创建套接字,返回套接字的描述符,失败返回-1套接字描述符和文件描述一回事儿,遵循最小未使用原则

1.3 如何向套接字文件中写入ip 和 port

套接字写入ip和port其实就是明确一下ip和port到底是多少

之前讲过,服务器和客户端都需要明确ip和port

也就是说,服务器套接字和客户端套接字,都需要将ip和port写入套接字里面

1.3.1 先要准备一个地址信息结构体:struct sockaddr_in

该结构体结构如下:
struct sockaddr_in{unsigned short sin_family; // 这是一个标记位,固定写 AF_INETunsigned short sin_port; // 端口号struct in_addr sin_addr;// 一个结构体,结构如下struct in_addr{unsigned int s_addr; // 用来存放ip地址的变量        } unsigned char zero[8]; // 没有实际意义,完全为了字节对齐填充大小
}实例:准备将 "192.168.1.1" 和 8888 端口写入结构体中,为未来写入套接字中做准备struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(8888); // 因为本地字节序和网络字节序不一定一致,所以端口号在进入网络之前,一定要转换成大端字节序addr.sin_addr.s_addr = inet_addr("192.168.1.1");

1.3.2 将准备好的存有ip和port的结构体写入套接字中

函数原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能描述:将写有ip和port地址信息结构体,写入套接中
参数描述:参数 sockfd:准备写入ip和port的套接字参数 addr:写有ip和port的结构体地址,该结构体如下struct sockaddr {unsigned short sa_family;  // 固定写 AF_INETchar        sa_data[14]; // 这个14个字节的内存里面,就是用来存放 ip 和 port的}如果使用这个结构体去存放ip和port的话,代码如下参数 addrlen:就是第二个参数 addr 的实际占用长度
返回值:成功返回0,失败返回-1。bind函数非常容易报错,只要绑定的端口号已经被用了,就会报错这个 struct sockaddr 这个结构体我们成为通用地址结构体
事实上有2个结构体会通过我们所介绍的地址上的0101直接赋值的形式转换成 struct sockaddr 这个结构体
struct sockaddr_in
struct sockaddr_un调用形式struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(8888); // 因为本地字节序和网络字节序不一定一致,所以端口号在进入网络之前,一定要转换成大端字节序addr.sin_addr.s_addr = inet_addr("192.168.1.1");if(bind(server,(struct sockaddr*)&addr,sizeof(addr)) == -1){perror("bind");    }

1.4 如何使用套接字文件传输数据

1.4.1 直接使用 read 或者 write 函数

文件IO里面的read 和 write 怎么用,套接字的read和write就怎么用

不再介绍

1.4.2 recv 和 send

这2个函数专门给套接字使用的,描述符用不了

函数原型:ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能描述:通过套接字,将数据发送到网络中
参数描述:前3个参数 sockfd、buf、len :功能和write一模一样参数 flags:这个参数也是send 和 write 的区别所在flags 可以设定 send 是一个阻塞型 IO 还是非阻塞型 IO0:阻塞型IOMSG_DONTWAIT:非阻塞型IOsend什么时候阻塞:发送数据目标地点,如果满了,则send会阻塞,直到目标地点产生新的空间为止、所以从我们的角度来看:send 和write 唯一的区别在于send 自带设置阻塞和非阻塞的参数write 不自带这个功能,默认阻塞函数原型:ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能描述:通过套接字,从网络中读取数据
参数描述:前3个参数 sockfd、buf、len :功能和read一模一样参数 flags:这个参数也是send 和 write 的区别所在flags 可以设定 send 是一个阻塞型 IO 还是非阻塞型 IO0:阻塞型IOMSG_DONTWAIT:非阻塞型IO    所以从我们的角度来看:recv 和 read 唯一区别在于recv 自带设置阻塞和非阻塞的参数read 不自带,默认阻塞

1.5 如何将任意一个阻塞型IO函数,设置成非阻塞的

函数原型:int fcntl(int fd, int cmd, ... /* arg */ );
功能描述:该函数有多个功能,到底执行哪个功能由 cmd 的值决定
参数描述:参数 cmd :F_GETFL:获取 fd 描述符的 flagF_SETFL:设置 fd 描述符的 flag当cmd选择F_SETFL的时候,需要传入第3个参数,第三个参数功能为 想要设置的具体的flag的值到底什么是flag:其实就是open函数第2个参数 flag,也就是文件描述符属性属性有:可读,可写,追加,清空,创建,非阻塞 等等等等以scanf为例:通过fcntl函数将标准输入流修改成非阻塞型IOscanf 用的是 stdin 标准输入流,阻塞型IO一旦将标准输入流修改成非阻塞型IO之后,scanf就不阻塞了

二、创建服务器

2.1 服务器的搭建

2.1.1 创建服务器套接字:socket

2.1.2 提前准备ip和port:struct sockaddr_in addr

2.1.3 为服务器套接字绑定ip和port :bind

2.1.4 创建一个监听列表:listen

所有连接服务器的客户端,都会被服务器加入到监听列表中去

函数原型:int listen(int sockfd, int backlog);
功能描述:创建监听列表并监听客户端连接,如果有客户端连接,则将该客户端加入监听列表中
参数描述:参数 sockfd:哪个描述符需要监听并创建监听列表,一般就是服务器的描述符参数 backlog:监听列表的大小

2.1.5 从监听列表中,接受客户端的连接:accept

函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能描述:接受客户端的连接,并且获取该客户端的ip和port
参数描述:参数 sockfd:哪个描述符接受客户端的连接,一般就是服务器参数 addr:一个地址信息结构体的地址,该结构体中将会接受并存放新链接的客户端的ip和port参数 addrlen:第二个参数的实际长度,但是注意这里是个指针返回值:成功接受客户端的连接之后,会返回该客户端的套接字客户端套接字非常有用,服务器与特定的客户端进行通信的时候,必须使用该客户端套接字调用形式:struct sockaddr_in client_addr = {0};int len = sizeof(client_addr);int client = accept(server,(struct sockaddr*)&client_addr,&len);当然,我们也可以仅接受客户端的连接,不需要知道客户端的ip和portint client = accept(server,NULL,NULL);注意:accept 函数是一个阻塞型函数也就是说,一旦调用accept函数就会立刻阻塞,直到有客户端连接为止

2.1.6 服务器代码

三、创建客户端

3.1 客户端的搭建

3.1 创建客户端套接字 :socket

3.2 为客户端准备 ip 和 port :struct sockaddr_in addr

3.3 连接服务器:connect

函数原型:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能描述:根据提供的ip和port连接到指定服务器
参数描述:参数 sockfd:客户端套接字参数 addr:存有ip和port的一个通用地址信息结构体参数 addrlen:第2个参数的实际长度
返回值:成功连接返回0,失败返回-1,因为存在失败的可能,所以记得判空调用形式struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(8888); // 因为本地字节序和网络字节序不一定一致,所以端口号在进入网络之前,一定要转换成大端字节序addr.sin_addr.s_addr = inet_addr("192.168.1.1");if(connect(server,(struct sockaddr*)&addr,sizeof(addr)) == -1){perror("bind");    }

3.4 客户端断开连接

客户端一旦与服务器断开链接之后

服务器那边,通过客户端套接字读取客户端发送数据的read或者recv函数,就会从阻塞变成非阻塞

变成非阻塞之后,如果没有读取到数据,则会返回0

所以我们可以根据read或者recv的返回值来判断客户端是否断开连接

3.5 客户端代码

四、TCP中的粘包现象

tcp协议为了提高发送的效率,会将短时间连续发送的小数据,当做一组数据统一发送

原理是:

tcp协议本身存在一个1500字节的缓存区,tcp协议每次write发送数据的时候,总是会发送1500个字节

如果发送了n组数据,这n组数据的时间间隔很短,并且数据总大小没有超过1500个字节

那么TCP协议就会将这n组数据全都放到同一个1500字节的缓存区中去,统一发送

4.1 协议包

规定好一组数据的固定大小,以及一组数据里面每个数据占据多少个字节

然后服务器和客户端,全都遵循同样的规定实现数据的收发

这样的规定如果我们把它打包写成具体的代码,打包出来的成果我们就称为协议包

4.1.1 使用协议包的服务器

4.1.2 使用协议包的客户端

相关文章:

网络编程——套接字、创建服务器、创建客户端

一、套接字 1.1什么是套接字 套接字文件,原本就是一个和管道文件类似,用来实现进程间通信的一个文件 既然有了管道文件,当时为什么还要开发套接字文件,去实现进程的通信 因为管道文件是半双工模式的 套接字文件是全双工模式的…...

【设计模式】3W 学习法深入剖析创建型模式:原理、实战与开源框架应用(含 Java 代码)

3W 学习法总结创建型模式(附 Java 代码实战及开源框架应用) 创建型模式主要关注 对象的创建,旨在提高代码的可复用性、可扩展性和灵活性。本文采用 3W 学习法(What、Why、How),深入分析 五大创建型模式&am…...

软考系统架构师考试目录(2023新版)

论文 2023下半年 开发:论面向对象设计的应用与实现大数据:论多数据源集成的应用与实现测试:论软件可靠性评价的设计与实现运维:论边云协同的设计与实现 2024上半年 大数据:Lambda架构,分层批处理层、加…...

Apifox Helper 自动生成API接口文档

在我们开发过程中我们在编写请求地址和编写请求参数的时候特别花费时间耗费了我们很多时间,作为一个程序员,更应该把精力时间集中在开发上, Apifox Helper 是 Apifox 团队针对 IntelliJ IDEA 环境所推出的插件,可以在 IDEA 环境中…...

MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景1.1.1 MySQL的发展历程与市场地位1.1.2 MySQL的核心特性与技术优势1.1.2…...

电鱼智能EFISH-RK3576-SBC工控板已适配Android 14系统

EFISH-RK3576-SBC工控板此前已提供了Linux 6.1.57系统,为了满足更多客户的需求,电鱼智能近日又为其成功适配了Android 14系统——硬件性能卓越的核心板与Android 14的深度组合,将为用户带来更加流畅、开放、智能的使用体验。 一、高性能处理器…...

C++ 语法之函数和函数指针

在上一章中 C 语法之 指针的一些应用说明-CSDN博客 我们了解了指针变量&#xff0c;int *p;取变量a的地址这些。 那么函数同样也有个地址&#xff0c;直接输出函数名就可以得到地址&#xff0c;如下&#xff1a; #include<iostream> using namespace std; void fun() …...

LabVIEW生成EXE文件错误提示

在LabVIEW生成EXE时弹出 “The build is missing one or more source files or items the source files reference on disk”&#xff0c;表明项目中引用的某些文件&#xff08;如VI、子模块、依赖库或配置文件&#xff09;未被正确包含或路径丢失。以下是具体原因及解决方案&a…...

HTML,CSS,JavaScript

HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式&#xff0c;如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。 MDN前端开发文档(MDN Web Docs) HTML HTML(HyperText Markup Language):超文本标记语言超文本:超越了文本的…...

SpringCloud 学习笔记2(Nacos)

Nacos Nacos 下载 Nacos Server 下载 | Nacos 官网 下载、解压、打开文件&#xff1a; 更改 Nacos 的启动方式 Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。 把 cluster 改为 standalone&#xff0c;记得保存&#xff01; 启动startup.cmd Ubuntu 启动…...

Qt5.15.2实现Qt for WebAssembly与示例

目录 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的优势 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特点 1.5 编译过程 1.6 运行时环境 注意&#xff01;&#xff01;&#xff01;注意&am…...

荣耀手机怎么录制屏幕?屏幕录制后为视频加水印更有“安全感”

在数字时代&#xff0c;屏幕录制已经成为记录和分享信息的重要方式之一。无论是记录游戏的高光时刻&#xff0c;还是制作教学视频&#xff0c;亦或是保存重要的线上会议内容&#xff0c;屏幕录制都能轻松搞定。 荣耀手机作为一款功能强大的设备&#xff0c;自然也提供了便捷的…...

3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案

一、引言 在产品设计的前沿领域&#xff0c;3DXML 与 SOLIDWORKS 作为主流格式&#xff0c;虽各有所长&#xff0c;但因格式差异&#xff0c;常成为数据流通与协作的阻碍。对于技术人员和学生党而言&#xff0c;掌握二者间的转换技术&#xff0c;不仅能提升设计效率&#xff0…...

CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试

目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后&#xff0c;进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…...

JS—基本数据类型和引用数据类型:1分钟掌握两者的区别

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–分类三–核心区别四–实际场景中的问题五–总结对比 二. 分类 前面说过这么判断数据类型&#xff0c;今天来说说基本数据类型和引用数据类型的区别。 基本数据类型引用数据类型StringObjectNumberFunct…...

使用 CryptoJS 实现 AES 解密:动态数据解密示例

在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...

[设计模式与源码]1_Spring三级缓存中的单例模式

欢迎来到啾啾的博客&#x1f431;&#xff0c;一个致力于构建完善的Java程序员知识体系的博客&#x1f4da;&#xff0c;记录学习的点滴&#xff0c;分享工作的思考、实用的技巧&#xff0c;偶尔分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604…...

使用React和google gemini api 打造一个google gemini应用

实现一个简单的聊天应用&#xff0c;用户可以通过输入问题或点击“Surprise me”按钮获取随机问题&#xff0c;并从后端API获取回答。 import { useState } from "react"; function App() {const [ value, setValue] useState(""); // 存储用户输入的问题…...

为什么Django能有效防御CSRF攻击?

在当今这个互联网高度发达的时代&#xff0c;Web安全问题层出不穷&#xff0c;其中跨站请求伪造&#xff08;CSRF&#xff0c;Cross-Site Request Forgery&#xff09;就是一个比较常见的威胁。攻击者利用用户的身份信息&#xff0c;发送恶意请求&#xff0c;改变用户的属性或执…...

Oracle常见系统函数

一、字符类函数 1&#xff0c;ASCII(c)和CHR(i)字符串和ascii码互转换 SQL> select ascii(Z) ,ascii(H),ascii( A) from dual;ASCII(Z) ASCII(H) ASCII(A) ---------- ---------- ----------90 72 32SQL> select chr(90),chr(72),chr(65) from dual;C…...

【Visio使用教程】

Visio使用教程 1. Visio 的基本介绍1.1 Visio 是什么&#xff1f;核心特点&#xff1a; 1.2 主要功能与应用场景典型用途&#xff1a;行业应用&#xff1a; 1.3 版本与兼容性1.4 Visio下载1.5 安装 2. Visio 的界面与基础操作2.1 界面布局详解2.2 创建新文档与模板选择2.3 形状…...

蓝桥杯 修剪灌木

问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修…...

HTML中滚动加载的实现

设置div的overflow属性&#xff0c;可以使得该div具有滚动效果&#xff0c;下面以div中包含的是table来举例。 当table的元素较多&#xff0c;以至于超出div的显示范围的话&#xff0c;观察下该div元素的以下3个属性&#xff1a; clientHeight是div的显示高度&#xff0c;scrol…...

bbbbb

import java.util.ArrayList; import java.util.List; public class KthPermutation { public static String getPermutation(int n, int k) { // 计算阶乘 int[] factorial new int[n]; factorial[0] 1; for (int i 1; i < n; i) …...

Linux文件

1.Open函数 高频使用的Linux系统调用&#xff1a;open write read close Linux自带的工具&#xff1a;man手册&#xff1a; man 1是普通的shell命令&#xff0c;比如ls man 2是系统调用函数&#xff0c;比如open&#xff0c;write说明 在Linux系统库的定义&#xff1a; int o…...

kafka指北

为自己总结一下kafka指北&#xff0c;会持续更新。创作不易&#xff0c;转载请注明出处。 目录 集群controller选举过程broker启动流程 主题创建副本分布ISRleader副本选举机制LEO 生产数据流程同步发送和异步发送 分区策略ack应答生产者发送消息的幂等性跨分区幂等性问题&…...

Linux安装部署Elasticsearch8 全过程记录

一、安装 Elasticsearch8 1、下载 访问 Elasticsearch 官方网站&#xff08;Download Elasticsearch | Elastic&#xff09;。 在下载页面找到 Elasticsearch 8 的 Linux 版本&#xff08;.tar.gz 格式&#xff09;下载链接&#xff0c;点击下载。 下载Elasticsearch8&…...

ESP32(3)UDP通信

对于 lwIP 的 Socket 的使用方式&#xff0c;它与文件操作非常相似。在文件操作中&#xff0c;我们首先打开文件&#xff0c;然后进行读/写操作&#xff0c;最后关闭文件。在TCP/IP网络通信中&#xff0c;也存在着相同的操作流程&#xff0c;但所使用的接口不再是文件描述符或 …...

汽车机械钥匙升级一键启动的优点

汽车机械钥匙升级一键启动的优点主要包括&#xff1a; 便捷性&#xff1a;一键启动功能的引入极大地提升了用车便捷性。车主无需翻找钥匙&#xff0c;只需在车辆感应范围内轻触启动键&#xff0c;即可轻松发动汽车。 安全性&#xff1a;移动管家专车专用一键启动系统配备了防…...

【matlab例程】三维下的TDOA定位和EKF轨迹滤波例程,TDOA的锚点数量可自定义(订阅专栏后可获得完整代码)

本文所述的MATLAB例程实现了TDOA定位和扩展卡尔曼滤波(EKF)来提高位置估计的准确性,并通过可视化结果进行分析。 文章目录 运行结果MATLAB代码程序讲解关键步骤和功能步骤解释注意事项总结运行结果 三维轨迹: 三维误差曲线: RMSE曲线: 命令行输出内容:...

个人blog系统 前后端分离 前端js后端go

系统设计&#xff1a; 1.使用语言&#xff1a;前端使用vue&#xff0c;并使用axios向后端发送数据。后端使用的是go的gin框架&#xff0c;并使用grom连接数据库实现数据存储读取。 2.设计结构&#xff1a; 最终展示&#xff1a;仅展示添加模块&#xff0c;其他模块基本相似 前…...

OSG简介

OSG OpenSceneGraph (简称 OSG) 是一个开源的高性能3D图形库。 作用 它为开发者提供了一个强大的API&#xff0c;处理和渲染复杂的3D图形。 特点 OSG基于OpenGL构建&#xff0c;提供了对现代图形技术的支持&#xff0c;如着色器、纹理映射、光照模型等高级特性。 跨平台支…...

社区版Uos20.9从源码编译QT5.15.2

主要是在这个文章上学的究极保姆式教你如何在Ubuntu上源码安装Qt5.15.2_ubuntu安装qt5.15.2-CSDN博客 但原文上在环境变量的配置上真用在 uso上好像不行&#xff0c;要加一些引号和$号。原文的测试编译代码也有些问题&#xff0c;include上少了类。略作修改&#xff0c;在UOS社…...

AI学习第二天--大模型压缩(量化、剪枝、蒸馏、低秩分解)

目录 1. 量化&#xff1a;压缩大象的“脂肪” 比喻 技术逻辑 2. 剪枝&#xff1a;修剪大象的“无效毛发” 比喻 技术逻辑 3. 知识蒸馏&#xff1a;让大象“师从巨象” 比喻 技术逻辑 4. 低秩分解&#xff1a;把大象“折叠成纸偶” 比喻 技术逻辑 5. 推理优化&#…...

C++ —— 线程同步(互斥锁)

C —— 线程同步&#xff08;互斥锁&#xff09; 线程同步互斥锁&#xff08;互斥量&#xff09;测试代码mutex互斥锁 线程同步 线程同步&#xff1a;多线程协同工作&#xff0c;协商如何使用共享资源。 C11线程同步包含三部分内容&#xff1a; 互斥锁&#xff08;互斥量&…...

相对路径跳转和绝对路径跳转有什么区别?

在 Vue 3 中使用路由跳转时&#xff0c;相对路径跳转和绝对路径跳转在使用方式、适用场景等方面存在明显区别&#xff0c;以下为你详细介绍&#xff1a; 定义 绝对路径跳转&#xff1a;指的是使用完整的路径来进行路由导航&#xff0c;路径以 / 开头&#xff0c;无论当前处于…...

Flume详解——介绍、部署与使用

1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源&#xff08;如日志文件、消息队列等&#xff09;传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点&#xff1a; 可扩展&#xff1…...

笔记类AI应用体验

笔记类AI应用体验 叮当好记视频一键转笔记&#xff0c; 祝你学习效率起飞 IMAGet笔记印象笔记&#xff08;Evernote&#xff09;&#xff1a;Notion&#xff1a;Trilium Notes&#xff1a;二、开始搭建三、搭建步骤四、创建博客 Obsidian&#xff1a;案例让ai帮我执行大模型学习…...

Mysql篇——SQL优化

本篇将带领各位了解一些常见的sql优化方法&#xff0c;学到就是赚到&#xff0c;一起跟着练习吧~ SQL优化 准备工作 准备的话我们肯定是需要一张表的&#xff0c;什么表都可以&#xff0c;这里先给出我的表结构&#xff08;表名&#xff1a;userinfo&#xff09; 通过sql查看…...

【css酷炫效果】纯CSS实现故障文字特效

【css酷炫效果】纯CSS实现故障文字特效 缘创作背景html结构css样式完整代码基础版进阶版(3D效果) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492053 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚…...

【Java】链表(LinkedList)(图文版)

本博客总结了Java当中链表的实现&#xff0c;以及相关方法的使用&#xff0c;在最后附带了一些常见链表相关处理技巧&#xff0c;希望对你有帮助&#xff01; ps&#xff1a;可拷贝到IDEA上自行测试&#xff0c;代码全部完成测试。 一.链表概述 1.什么是链表&#xff1f; 链…...

审批工作流系统xFlow

WorkFlow-审批流程系统 该项目为完全开源免费项目 可用于学习或搭建初始化审批流程系统 希望有用的小伙伴记得点个免费的star gitee仓库地址 仿钉钉飞书工作审批流系统 介绍 前端技术栈: vue3 ts vite arcodesign eslint 后端技术栈:springbootspring mvc mybatis mavenmysq…...

UNION,UNION ALL 的详细用法

目录 一、基本概念 二、核心区别 三、语法使用规则 四、代码实演示 4.1 两张表字段相同&#xff0c;字段顺序也相同 4.2 两张表字段相同。但字段顺序不同 4.3 两张表存在相同字段&#xff0c;但一张表字段多&#xff0c;一张表字段少 一、基本概念 操作符功能描述去重处…...

Java 集合遍历过程中修改数据触发 Fail-Fast 机制 ,导致报ConcurrentModificationException异常

Java Fail-Fast 机制 Fail-Fast 机制是 Java 集合框架中的一种错误检测机制&#xff0c;用于在遍历集合时检测结构修改。如果在迭代器创建之后&#xff0c;集合被修改&#xff08;例如添加或删除元素&#xff09;&#xff0c;并且这种修改不是通过迭代器自身的 remove() 方法进…...

Javascript 日期相关计算

1、获取当前日期的前一天 // 获取当前日期let today new Date();today.setDate(today.getDate() - 1);// 转换为本地日期字符串格式let yesterdayStr today.toISOString().slice(0, 10);console.log(yesterdayStr); // 例如: "2023-04-03" (格式取决于地区设置) 2…...

自动驾驶背后的数学:特征提取中的线性变换与非线性激活

在上一篇博客「自动驾驶背后的数学&#xff1a;从传感器数据到控制指令的函数嵌套」—— 揭秘人工智能中的线性函数、ReLU 与复合函数中&#xff0c;我们初步探讨了自动驾驶技术中从传感器数据到控制指令的函数嵌套流程&#xff0c;其中提到了特征提取模块对传感器数据进行线性…...

DNS解析查询工具

dig命令 1 常用命令 命令&#xff1a;dig 您的域名&#xff08;示例&#xff1a;dig www.baidu.com&#xff09; 2、根据解析记录查询&#xff0c;比如MX&#xff0c;CNAME&#xff0c;NS&#xff0c;PTR等&#xff0c;只需将类型加在命令后面即可。 示例&#xff1a;dig bai…...

【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发

在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上&#xff0c;将隧道转发改成直接转发 一、改成直接转发需要改动的配置 &#xff08;一&#xff09;将连接AP的接口改成trunk口&#xff0c;并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …...

解决远程卡在下载vscode-server的问题,一键安装脚本

vscode-server 下载与安装脚本 vscode-server一键安装脚本 简介 此脚本用于下载并安装指定提交 ID 和架构的 VS Code Server。用户可以选择不同的架构&#xff0c;并输入对应的 VS Code 提交 ID 来下载和安装 vscode-server。VS Code提交ID可以在VS Code界面“帮助>关于…...

【unity实战】用unity封装一个复杂全面且带不同射击模式的飞机大战射击系统

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...