HTTP协议解析:Session/Cookie机制与HTTPS加密体系的技术演进(一)
一.HTTP协议
我们上篇文章已经提到了对于自定义协议的序列化与反序列化。那么有没有什么比较成熟的,大佬们写的应用层协议,供我们参考使用呢?HTTP(超文本传输协议)就是其中之一。
在互联网世界中, HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一个至关重要的协议。 它定义了客户端(如浏览器) 与服务器之间如何通信, 以交换或传输超文本(如 HTML 文档) 。
HTTP 协议是客户端与服务器之间通信的基础。 客户端通过 HTTP 协议向服务器发送请求, 服务器收到请求后处理并返回响应。 HTTP 协议是一个无连接、 无状态的协议, 即每次请求都需要建立新的连接, 且服务器不会保存客户端的状态信息。
TIPS:超文本传输通俗的来说就是指传输的文件类型不仅限于文本,还可以是图片,视频等等。
1.1什么是URL
通俗点来说URL就是我们平常所说的网址, 但图中部分的消息我们现在一般很少或根本不可能从URL上看到:
- 登录信息(user:pass@)。这个其实不可能看到的原因很简单,因为没有人会把自家钥匙直接挂在门上。这部分现在都以登录页面输入密码或手机验证码等更安全的形式替代了。
- 显示端口号(:80)。以前在HTTP(:80)或HTTPS(:443)不常用的时候,为了让用户辨清那个是我网站的"门",一般会带上。但现在对于HTTP/HTTPS已经很成熟了,浏览器会默认加上80或443,所以一般是不带上的现在。但如果说是我们自己在服务器创建的服务,比如他的服务端口号8080,这个时候就需要带上了。
- 带扩展名的路径(/dir/index.htm)。以前的时候网址直接对应服务器上的文件路径,也就是说/dir/index.htm这个文件是在服务器中真实存在的。但现在一般都使用的动态生成内容比如dy的/video/123不是真实文件,将文件扩展名隐藏了起来,更加简介与安全。
- 查询字符串(?uid=1)和片段(#ch1)。以前
?uid=1
传参数、#ch1
跳转到章节,像在网址里手写操作说明。现在参数可能藏在路由里(比如/user/1
代替?uid=1
)。#ch1
更多用于网页内跳转(比如点目录跳章节),而单页应用(如抖音)用它控制页面切换。
1.2urlencode 和 urldecode
像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了。因此这些字符不能随意出现.比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义。
转义的规则如下:
将需要转码的字符转为 16 进制, 然后从右到左, 取 4 位(不足 4 位直接处理), 每 2 位做一位, 前面加上%, 编码成%XY 格式。
比如:
可以看到+被转义为了%2B。urldecode 就是 urlencode 的逆过程;
UrlEncode编码/UrlDecode解码 - 站长工具
1.3HTTP协议请求与响应格式
一个请求报文示例如下:
而对于HTTP的请求与应答报文结构通常如下:
对于请求报文REQUSET第一行为空行,接下来为请求报头,请求报头以空行与正文内容分离。 应答报文也是类似。
基本的应答格式:
应答的正文内容一般是html,css,图片,音频,视频等文件。 这个图片中的Content-Type:text/html说明应答文件类型是html的,Content-Lenth说明正文长度为22000。Conection等我们后面部分重要的会提到。
1.4HTTP方法
一般最经常使用的为GET与POST方法。如果说所有方法的使用机率和为100%,那么他俩一共就占到90%甚至更高。
1.4.1GET方法与POST方法(重点)
简单的理解,GET就是获取资源,POST就是上传资源。我们一般的上网行为通常无非就两种,上传和获取。又因为我们网络通信其实本质上是进程间通信,也就是说我们上网本质就是IO。
GET一般从服务器获取图片,音频,html网页等静态资源。虽说POST一般用于上传资源,但我们也可以使用GET上传资源。不过后者上传的资源大小一般是有限的。
1. GET 的限制:URL 长度问题
GET 的数据是放在 URL 里的,比如:
https://example.com/login?username=admin&password=123456
浏览器和服务器对 URL 长度有限制(通常 2048~8192 字符),太长的 URL 会被截断或报错。就像写信时地址栏写不下太多字,信封(URL)塞太多内容会被邮局拒收。
2. POST 的优势:数据放在“信封内部”POST 的数据是放在 HTTP 请求的“正文”(body)里的,比如:
<form method="POST" action="/login"><input type="text" name="username" value="admin"><input type="password" name="password" value="123456"> </form>
服务器不会限制 POST 数据大小(但实际仍受服务器配置影响,比如 PHP 默认限制 8MB
)。就像把内容写在信纸(body)里,信封(URL)只写收件地址,能塞更多内容。
HTML 表单 | 菜鸟教程
1.4.2PUT方法(不常用)
PUT 方法的核心作用:将数据(如文件、JSON)上传到服务器的指定位置,并让服务器按你给的 URL 路径完整保存。类比:就像你往网盘(服务器)上传文件,并明确告诉它:“把这个文件 精确 存到 /docs/report.pdf
这个路径下”。
所以我们说PUT方法上传的方式过于暴力。我要把这个文件 精确 放到 /path/xxx
,不管原来有什么,直接覆盖!一般人家自己的服务器怎么可能不由分说就让你覆盖人家原有的文件,所以一般是被服务器禁止使用的。
1.4.3Head方法
与 GET 方法类似, 但不返回报文主体部分, 仅返回响应头。比如:HEAD /index.html HTTP/1.1用于确认 URL 的有效性及资源更新的日期时间等。
// curl -i 显示
$ curl -i www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, notransform
Connection: keep-alive
Content-Length: 2381
Content-Type: text/html
Date: Sun, 16 Jun 2024 08:38:04 GMT
Etag: "588604dc-94d"
Last-Modified: Mon, 23 Jan 2017 13:27:56 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<!DOCTYPE html>
...
// 使用 head 方法, 只会返回响应头
$ curl --head www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, notransform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Sun, 16 Jun 2024 08:43:38 GMT
Etag: "575e1f71-115"
Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
1.4.4DELETE方法(不常用)
用于删除文件, 是 PUT 的相反方法。比如: DELETE /example.html HTTP/1.1。按请求 URL 删除指定的资源。所以不用多说为什么不常用,和PUT一样一般都是被禁止的。
1.4.5OPTIONS方法
用于查询针对请求 URL 指定的资源支持的方法。示例:OPTIONS * HTTP/1.1。返回允许的方法, 如 GET、 POST 等。
不支持的效果
// 搭建一个 nginx 用来测试
// sudo apt install nginx
// sudo nginx -- 开启
// ps ajx | grep nginx -- 查看
// sudo nginx -s stop -- 停止服务
$ sudo nginx -s stop
$ ps ajx | grep nginx
2944845 2945390 2945389 2944845 pts/1 2945389 S+ 1002 0:00
grep --color=auto nginx
$ sudo nginx
$ ps axj | grep nginx
1 2945393 2945393 2945393 ? -1 Ss 0 0:00
nginx: master process nginx
2945393 2945394 2945393 2945393 ? -1 S 33 0:00
nginx: worker process
2945393 2945395 2945393 2945393 ? -1 S 33 0:00
nginx: worker process
2944845 2945397 2945396 2944845 pts/1 2945396 S+ 1002 0:00
grep --color=auto nginx
// -X(大 x) 指明方法
$ curl -X OPTIONS -i http://127.0.0.1/
HTTP/1.1 405 Not Allowed
Server: nginx/1.18.0 (Ubuntu)
Date: Sun, 16 Jun 2024 08:48:22 GMT
Content-Type: text/html
Content-Length: 166
Connection: keep-alive
<html>
<head><title>405 Not Allowed</title></head>
<body>
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.18.0 (Ubuntu)</center>
</body>
</html>
405Not ALLowed就表示服务器不想告诉客户端我支持什么HTTP请求方法。
支持的效果
HTTP/1.1 200 OK
Allow: GET, HEAD, POST, OPTIONS
Content-Type: text/plain
Content-Length: 0
Server: nginx/1.18.0 (Ubuntu)
Date: Sun, 16 Jun 2024 09:04:44 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
// 注意: 这里没有响应体, 因为 Content-Length 为 0
说明当前该服务端口支持GET,HEAD,POST,OPTIONS这四种方法。
1.5HTTP状态码
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)。
需要注意的是,网站返回的状态码因为没有严格要求程序员一般都不认真写的原因,其实可信度不大。还有安全方面的问题。比如服务器崩了的时候,为了防止一些人趁病要命,一般不会给你返回5XX的状态码,要么直接返回OK,要么返回404。
关于重定向的验证, 以 301 为代表
HTTP 状态码 301(永久重定向) 和 302(临时重定向) 都依赖 Location 选项。 以下是关于两者依赖 Location 选项的详细说明:
HTTP 状态码 301(永久重定向) :
当服务器返回 HTTP 301 状态码时, 表示请求的资源已经被永久移动到新的位置。在这种情况下, 服务器会在响应中添加一个 Location 头部, 用于指定资源的新位置。 这个 Location 头部包含了新的 URL 地址, 浏览器会自动重定向到该地址。例如, 在 HTTP 响应中, 可能会看到类似于以下的头部信息:
HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\n
HTTP 状态码 302(临时重定向) :
当服务器返回 HTTP 302 状态码时, 表示请求的资源临时被移动到新的位置。同样地, 服务器也会在响应中添加一个 Location 头部来指定资源的新位置。 浏览器会暂时使用新的 URL 进行后续的请求, 但不会缓存这个重定向。例如, 在 HTTP 响应中, 可能会看到类似于以下的头部信息:
HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n
总结: 无论是 HTTP 301 还是 HTTP 302 重定向, 都需要依赖 Location 选项来指定资源的新位置。 这个 Location 选项是一个标准的 HTTP 响应头部, 用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。
1.6HTTP常见Header
- Content-Type: 数据类型(text/html 等)
- Content-Length: Body 的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;(后面会细讲)
关于 connection 报头
HTTP 中的 Connection 字段是 HTTP 报文头的一部分, 它主要用于控制和管理客户端与服务器之间的连接状态。
核心作用
管理持久连接: Connection 字段还用于管理持久连接(也称为长连接) 。 持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接, 以便在同一个连接上发送多个请求和接收多个响应。
持久连接(长连接)
HTTP/1.1: 在 HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接。
HTTP/1.0: 在 HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。
语法格式
Connection: keep-alive: 表示希望保持连接以复用 TCP 连接。
Connection: close: 表示请求/响应完成后, 应该关闭 TCP 连接。
HTTP常见Header的表格
1.7模拟实现一个最简单的HTTP服务器
实现一个最简单的 HTTP 服务器, 只在网页上输出 "hello world"; 只要我们按照 HTTP协议的要求构造数据, 就很容易能做到,就是把下面的功能模块在前文的代码上换个功能函数即可。
Http.hpp
#pragma once#include "Socket.hpp"
#include "TcpServer.hpp"
#include <iostream>
#include <string>
#include <memory>
#include <unordered_map>
#include "Util.hpp"using namespace socket_module;const std::string gspace = " ";
const std::string glinespace = "\r\n";//http换行符const std::string webroot = "./wwwroot";//web根目录
const std::string homepage = "/home.html";//web首页
const std::string glinesep = ": ";//http报头分隔符class HttpRequest
{
public:HttpRequest(){}//请求序列化std::string Serialize(){return std::string();}//请求反序列化bool Deserialize(std::string &reqstr){return true;}~HttpRequest(){}private:std::string _method;//请求方法std::string _uri;//统一资源定位符,通俗点来说就是网址std::string _version;//Http版本std::unordered_map<std::string, std::string> _headers;//请求行std::string _blankline;//空行分隔符std::string _text;//请求正文内容
};class HttpResponse
{
public:HttpResponse() : _blankline(glinespace){}//应答序列化std::string Serialize(){std::string status_line = _version + gspace + std::to_string(_code) + gspace + _desc + glinespace;std::string resp_header;_headers["Set-Cookie"] = "zhangsan=Xiu123hehe@";for (auto &header : _headers){std::string line = header.first + glinesep + header.second + glinespace;resp_header += line;}return status_line + resp_header + _blankline + _text;}//应答反序列化bool Deserialize(std::string &reqstr){return true;}~HttpResponse() {}// private:
public:std::string _version;//http版本int _code;//状态码std::string _desc;//状态码描述 std::unordered_map<std::string, std::string> _headers;//应答报头std::string _blankline;//空行分割符std::string _text;//应答正文内容
};class Http
{
public:Http(uint16_t port):tsvrp(std::make_unique<TcpServer>(port)){}void HandlerHttpRquest(std::shared_ptr<Socket> &sock, InetAddr &client){#ifndef DEBUG#define DEBUGstd::string httpreqstr;// 假设:直接读到了完整的请求sock->Recv(&httpreqstr); std::cout << httpreqstr;// 直接构建最简单的http应答HttpResponse resp;resp._version = "HTTP/1.1";resp._code = 200; // successresp._desc = "OK";std::string filename = webroot + homepage;bool res = Util::ReadFileContent(filename, &(resp._text));(void)res;std::string response_str = resp.Serialize();sock->Send(response_str);#endif}void Start(){tsvrp->Start([this](std::shared_ptr<Socket> &sock, InetAddr client){ this->HandlerHttpRquest(sock, client); });}~Http(){}private:std::unique_ptr<TcpServer> tsvrp;
};
Util.hpp
#pragma once #include <iostream>
#include <fstream>
#include <string>// 工具类class Util
{
public://读取html文件内容到out中static bool ReadFileContent(const std::string &filename, std::string *out){// version1 字节流读取,但文件传输时默认是二进制传输,所以该版本无法传输图片// std::ifstream in(filename);// if (!in.is_open())// {// return false;// }// std::string line;// while(std::getline(in, line))// {// *out += line;// }// in.close();// return true;int filesize = FileSize(filename);if(filesize > 0){std::ifstream in(filename);if(!in.is_open())return false;out->resize(filesize);in.read((char*)(out->c_str()), filesize);in.close();}else{return false;}return true;}//读取请求或应答的一行将其提取出来并从源请求或应答中删除static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep/*\r\n*/){auto pos = bigstr.find(sep);if(pos == std::string::npos)return false;*out = bigstr.substr(0, pos);bigstr.erase(0, pos + sep.size());return true;}//读取文件的大小static int FileSize(const std::string &filename){std::ifstream in(filename, std::ios::binary);if(!in.is_open())return -1;in.seekg(0, in.end);int filesize = in.tellg();in.seekg(0, in.beg);in.close();return filesize;}
};
注意,需要在当前目录下创建一个目录wwwroot,并在当前目录下放一个能够打印hello world的html文件home.html。这个html文件直接询问ai生成即可。我们这里不再介绍html。
1.8HTTP版本
对于HTTP的Cookie与Session和Https,主要是http安全方面的问题。由于篇幅问题,我们放到下篇文章进行拆解介绍。
相关文章:
HTTP协议解析:Session/Cookie机制与HTTPS加密体系的技术演进(一)
一.HTTP协议 我们上篇文章已经提到了对于自定义协议的序列化与反序列化。那么有没有什么比较成熟的,大佬们写的应用层协议,供我们参考使用呢?HTTP(超文本传输协议)就是其中之一。 在互联网世界中, HTTP(HyperText Transfer Prot…...
Matlab 234-锂电池充放电仿真
1、内容简介 Matlab 234-锂电池充放电仿真 可以交流、咨询、答疑 2、内容说明 略 锂离子电池已经广泛应用于我国目前电子产品市场,当下手机市场和新能源市场对于锂离子电池的大量需求,推动了锂离子电池的发展,我国已经成为世界上锂离子电池…...
std::move 和 std::forward
关联点 都是执行转换(cast)的函数(函数模板),不产生任何可执行代码。且都可以把实参转换成右值。 std::move无条件将实参(const除外 )转换成右值引用,std::forward 条件返回右值引用 _EXPORT_STD template…...
工业协议跨界实录:零基础玩转PROFINET转EtherCAT主站智能网关
工业自动化领域的金字塔就是工业通信行业,用的最多的便是协议转换模块,通俗来说,网关就像一个“语言翻译器”,能把一种通信语言转换成另一种,满足实际通信需求,还能保护投资。PROFINET 转EtherCAT 网关WL-P…...
开源链动2+1模式AI智能名片S2B2C商城小程序赋能新微商服务能力升级研究
摘要:本文聚焦新微商服务能力升级路径,探讨开源链动21模式、AI智能名片与S2B2C商城小程序在重构培训体系、激励机制及用户服务中的协同作用。研究显示,新微商通过“技术赋能-机制创新-服务深化”三维变革,将传统微商的“产品压货”…...
vue3配置element-ui的使用
今天阐述一下如何在vue中进行配置使用element-ui; 一,配置下载Element 1.首页在电脑上下载好vue,以及npm,可以去相关的官方进行下载。 2.进行配置命令 npm install element-plus --save如报错: npm error code ERE…...
39-绘制渐变的文字
39-绘制渐变的文字_哔哩哔哩_bilibili39-绘制渐变的文字是一次性学会 Canvas 动画绘图(核心精讲50个案例)2023最新教程的第40集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibi…...
HBase进阶之路:从原理到实战的深度探索
目录 一、HBase 核心概念再梳理 1.1 RowKey 1.2 Column Family 1.3 Region 二、架构与运行机制剖析 2.1 架构组件详解 2.1.1 Client 2.1.2 Zookeeper 2.1.3 Master 2.1.4 RegionServer 2.1.5 HDFS 2.2 数据读写流程深度解析 2.2.1 数据写入流程 2.2.2 数据读取流…...
使用 AddressSanitizer 检测栈内存越界错误
一、概述 在 C/C 编程中,栈内存越界 是一种常见而危险的内存错误,通常发生在局部变量数组被访问时索引越界。由于栈空间的结构特点,越界写入可能覆盖返回地址或其他局部变量,导致不可预测的行为甚至程序崩溃。传统的调试手段难以定…...
【技巧】离线安装docker镜像的方法
回到目录 【技巧】离线安装docker镜像的方法 0. 为什么需要离线安装? 第一、 由于docker hub被墙,所以 拉取镜像需要配置国内镜像源 第二、有一些特殊行业服务器无法接入互联网,需要手工安装镜像 1. 可以正常拉取镜像服务器操作 服务器…...
vue实现与后台springboot传递数据【传值/取值 Axios 】
vue实现与后台springboot传递数据【传值/取值】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每…...
Git日志信息
Git日志信息 1. log log 命令用于查看 git 的各种日志信息,在使用 log 后,git 会进入 vim 模式,此时退出日志模式需要按下 q 键。可以通过小箭头来浏览未显示出来的内容。 1.1 查看日志信息 git log git log --prettyoneline #美观输出日…...
Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载
Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载 前言一、 软件包管理器1.1 传统安装方式的麻烦:从源代码说起1.2 软件包&…...
Java中的策略模式和模板方法模式
文章目录 1. 策略模式(Strategy Pattern)案例:支付方式选择 2. 模板方法模式(Template Method Pattern)案例:制作饮料流程 3. 策略模式 vs 模板方法模式4.总结 在Java中,策略模式和模板方法模式…...
C#里WPF使用触发器实现鼠标点击响应
在WPF里创建了一个自定义的用户控件, 要想在这个控件里实现鼠标的点击事件响应, 就需要添加事件触发器交互定义,如下代码: <ListView x:Name="ListViewMenu" ItemsSource="{Binding Path=SubItems}" Foreground="White" ScrollViewer.Ho…...
tensorflow-cpu
python3.8~3.12安装tensorflow-cpu 准备 创建并进入目录 mkdir tf-cpu cd tf-cpu编写测试代码 test_tensorflow.py import tensorflow as tf# 检查TensorFlow版本 print("\nTensorFlow version:", tf.__version__,end\n\n)# 创建一个简单的计算图并运行它 tensor …...
【AI提示词】PEST分析
提示说明 市场分析师专注于为企业、产品或国家提供PEST分析支持,以制定精准的市场战略。 提示词 # Role: PEST分析## Profile - language: 中文 - description: 市场分析师专注于为企业、产品或国家提供PEST分析支持,以制定精准的市场战略 - backgrou…...
42、在.NET 中能够将⾮静态的⽅法覆写成静态⽅法吗?
在.NET中,不能将非静态方法(实例方法)直接覆写(Override)为静态方法(Static Method)。以下是关键原因和解释: 1. 方法绑定的本质区别 实例方法:属于对象的实例…...
【嵌入式系统设计师(软考中级)】第三章:嵌入式系统软件基础知识——①软件及操作系统基础
文章目录 1. 嵌入式系统软件基础知识1.1 嵌入式软件分类1.2 嵌入式系统初始化1.3 无操作系统支持的嵌入式软件体系结构1.4 有操作系统支持的嵌入式软件体系结构1.5 嵌入式支撑软件 2. 嵌入式操作系统基础知识2.1 嵌入式操作系统基本概念2.2 处理器管理2.2.1 多道程序2.2.2 分区…...
cs224w课程学习笔记-第11课
cs224w课程学习笔记-第11课 知识图谱嵌入 前言一、知识图谱1、知识图谱特点2、关系类型 二、知识图谱嵌入1、嵌入核心思想2、嵌入模型2.1 嵌入模型transE1)、核心思想2)、训练步骤3)、模型表征能力 2.2 嵌入模型TransR2.3 DistMult嵌入模型1)、核心思想2)、表征能力 2.4 complE…...
5.10-套接字通信 - C++
套接字通信 1.1 通信效率问题 服务器端 单线程 / 单进程 无法使用,不支持多客户端 多线程 / 多进程 写程序优先考虑多线程:什么时候考虑多进程? 启动了一个可执行程序 A ,要在 A 中启动一个可执行程序 B 支持多客户端连接 IO 多…...
【Linux】Linux内核的网络协议之socket理解
1. Socket(套接字) 的本质 它是应用程序与网络协议栈之间的编程接口(API),用于实现网络通信。 Socket 并不是一个物理设备,而是一个抽象层为应用程序提供统一的网络操作接口(如 send()、recv()…...
仿函数和函数对象
1. 概念解读:什么是“函数”和“函数对象”? 核心概念一句话总结 仿函数(Functor) 函数对象(Function Object) 它们本质是一个对象(Object),但可以像函数(Fu…...
Kubernetes控制平面组件:Kubelet 之 Static 静态 Pod
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
Django 项目的 models 目录中,__init__.py 文件的作用
在 Django 项目的models/init.py文件中,这些导入语句的主要作用是将各个模型类从不同的模块中导入到models包的命名空间中。这样做有以下几个目的: 简化导入路径 当你需要在项目的其他地方使用这些模型时,可以直接从models包导入,…...
学习日志04 java
PTA上的练习复盘 java01 编程题作业感悟: 可以用ai指导自己怎么调试,但是不要把调代码这过程里面的精华交给ai,就是自己去修正错误不能让ai代劳!~~~ 1 scanner.close() Scanner *** new Scanner(System.in); ***.close(); …...
vue-pdf-embed预览PDF
一、vue-pdf-embed 链接:Yarn 1、安装插件 npm install vue-pdf-embed 2、文件中引入(分页效果已实现,样式请自行修改) <template><div class"download-pdf-preview" style"height: 450px; border:1…...
C++GO语言微服务之Dockerfile docker-compose
目录 01 01-知识点概述 02 02-dockerfile复习 03 03-环境变量ENV的使用 04 04-WORKDIR的使用 05 05-USER和ARG的使用 06 06-ONBUILD的使用 07 07-dockerfile的缓存相关的参数 08 08-dockerfile的编写 09 09-测试-没成功-好像是网不行 01 10-docker-compose介绍 02 11…...
【漫话机器学习系列】255.独立同分布(Independent and Identically Distributed,简称 IID)
深入理解独立同分布(IID):机器学习与统计学的基石 在机器学习、深度学习、统计建模等领域,我们经常会遇到一个重要假设:独立同分布(Independent and Identically Distributed,简称 IID…...
树莓派4 yolo 11l.pt性能优化后的版本
树莓派4 使用 Picamera2 拍摄图像,然后通过 YOLO11l.pt 进行目标检测,并在实时视频流中显示结果。但当前的代码在运行时可能会比较卡顿,主要原因包括: picam2.capture_array() 是一个较慢的操作;YOLO 推理可能耗时较长…...
AD22 快速定义PCB板框与DXF导入定义
自行定义板框 1. 初步评估:选中所有的器件,选中‘在矩形区域排列’ 将元件放好后,可以再将元件紧凑一下 2. 设置原点,并在下方选中机械一层 从原点出发,点击快捷键PL 画框线 3. 对线条长度取整,且最好是5…...
LInux系统文件与目录管理(二)
提示:第二部分对第一部分收尾 文章目录 常见的命令如下一、文件查看命令1. more命令2.less命令3.head命令4.tail命令5.nl命令(了解)6.创建目录命令7.创建文件命令>: 覆盖重定向>>: 追加重定向 8.touch命令9.echo命令10.文件或目录复…...
Redisson在业务处理中失败后的应对策略:保障分布式系统的可靠性
分布式系统中的数据一致性与高可用性一直是开发者面临的难题。作为Redis官方推荐的Java客户端,Redisson凭借其强大的分布式能力成为解决这些问题的利器。但在实际业务场景中,网络抖动、资源竞争、节点故障等问题可能导致操作失败,本文将深入探…...
windows下docker 运行 ros2humble arm64
目前要想运行arm版ros humble 目前最好的解决方案是使用qemu模拟。 1.拉取 ubuntu22.04 docker pull ubuntu:22.04 --platformarm642.安装小鱼ros2 humble wget http://fishros.com/install -O fishros && . fishros3.安装eqmu docker run --rm --privileged multia…...
表的增删改查 -- 2
目录 3、查询(R) 3.7、条件查询:where 3.8、分页查询:limit 3.9、查询总结 4、修改(U) 5、删除(D) 3、查询(R) 3.7、条件查询:where selec…...
Linux系统管理与编程20:Apache
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 做好网络和yum配置,用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …...
dfs 第一次加训 详解 下
目录 P1706 全排列问题 思路 B3618 寻找团伙 思路 B3621 枚举元组 思路 B3622 枚举子集(递归实现指数型枚举) 思路 B3623 枚举排列(递归实现排列型枚举) B3625 迷宫寻路 思路 P6183 [USACO10MAR] The Rock Game S 总结…...
vue2/3 中使用 @vue-office/docx 在网页中预览(docx、excel、pdf)文件
1. 安装依赖: #docx文档预览组件npm install vue-office/docx vue-demi0.14.6#excel文档预览组件npm install vue-office/excel vue-demi0.14.6#pdf文档预览组件npm install vue-office/pdf vue-demi0.14.6 vue2.6版本或以下还需要额外安装 vue/composition-api …...
Excel表的导入与导出
Excel表的导入与导出 根据excel表来建立所需的数据库表格 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version></dependency><dependency><groupId>cn.hutool&…...
Redis 中常见的数据类型有哪些?
Redis 常见的数据类型包括 5 种基础类型(String、Hash、List、Set、Zset)和 3 种特殊类型(HyperLogLog、Bitmap、Geospatial)。以下是详细说明: 一、5 种基础数据类型 1. 字符串(String) 特点…...
消息队列如何保证消息可靠性(kafka以及RabbitMQ)
目录 RabbitMQ保证消息可靠性 生产者丢失消息 MQ丢失消息 消费端丢失了数据 Kakfa的消息可靠性 生产者的消息可靠性 Kakfa的消息可靠性 消费者的消息可靠性 RabbitMQ保证消息可靠性 生产者丢失消息 1.事务消息保证 生产者在发送消息之前,开启事务消息随后生…...
基于STM32、HAL库的BMP390L气压传感器 驱动程序设计
一、简介: BMP390L 是 Bosch Sensortec 生产的一款高精度气压传感器,专为需要精确测量气压和海拔高度的应用场景设计。BMP390L 具有更低的功耗、更高的精度和更快的响应速度。 二、硬件接口: BMP390L 引脚STM32L4XX 引脚说明VDD3.3V电源GNDGND地SCLPB6 (I2C1 SCL)I2C 时钟线…...
QMK键盘固件中LED锁定指示灯的配置与使用详解(实操部分+拓展)
QMK键盘固件中LED锁定指示灯的配置与使用详解 大家好!今天就跟大家一起探索QMK固件中LED锁定指示灯的配置与使用。无论你是键盘DIY新手还是老司机,相信这篇教程都能帮你解锁新技能! 一、基础配置:定义LED引脚 在QMK固件中配置LED锁定指示灯非常简单,只需在config.h文件…...
【日撸 Java 三百行】Day 12(顺序表(二))
目录 Day 12:顺序表(二) 一、顺序表的方法 1. 顺序查找 拓展:顺序查找中的哨兵思想 2. 插入 3. 删除 二、代码及测试 拓展: 小结 Day 12:顺序表(二) Task: 今天…...
Python爬虫实战:研究ajax异步渲染加密
一、引言 在当今数字化时代,数据已成为推动各行业发展的核心驱动力。网络爬虫作为一种高效的数据采集工具,能够从互联网上自动获取大量有价值的信息。然而,随着 Web 技术的不断发展,越来越多的网站采用了 AJAX(Asynchronous JavaScript and XML)异步渲染技术来提升用户体…...
Golang企业级商城高并发微服务实战
Golang企业级商城高并发微服务实战包含内容介绍: 从零开始讲了百万级单体高并发架构、千万级微服务架构,其中包含Rpc实现微服务、微服务的跨语言调用jsonrpc和protobuf、protobuf的安装、protobuf高级语法、protobuf结合Grpc实现微服务实战、微服务服务…...
从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考
1引子: DFS和递归法的一道经典例题矩阵最长递增子序列这个题写完之后脑袋产生了许多突发奇想: 1 第一个堆栈代码段这些底层C语言内部管理的工具它是怎么进行内存分配的?能不能深究? 2 第二个这个DFS和计划数组存储的思路到底抽象…...
我开源了一个免费在线工具!UIED Tools
UIED Tools - 免费在线工具集合 最近更新:修改了文档说明,优化了项目结构介绍 这是设计师转开发的第一个开源项目,bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站,集成了多种实用工具,包括 AI …...
geoserver发布arcgis瓦片地图服务(最新版本)
第一步:下载geoserver服务,进入bin目录启动 需要提前安装好JDK环境,1.8及以上版本 安装完成,页面访问端口,进入控制台界面,默认用户名密码admin/geoserver 第二步:下载地图 破解版全能电子地图下载器&…...
RN 鸿蒙混合开发实践(踩坑)
#三方框架# #React Native # 1 。环境配置; 安装 DevEco 开发工具; Node 版本16; hdc环境配置 hdc 是 OpenHarmony 为开发人员提供的用于调试的命令行工具,鸿蒙 React Native 工程使用 hdc 进行真机调试。hdc 工具通过 OpenHa…...