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

[计算机网络]---Http协议

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

  如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 

本期学习:htpp协议,认识URL, 理解htpp协议的基本结构,写一个简单的http协议。

目录

一 、Http协议基础知识

1、基本概念

2、htpp基本结构 

2.1认识URL

 2.2urlencode和urldecode

2.3其他属性

二、基于Http服务器 

1、htppserver服务器

2、Protool.hpp 

3、Util.hpp 

4、wwwroot

5、程序运行后的细节


一 、Http协议基础知识

1、基本概念

        HTTP协议是一种无状态、应用层的协议,它定义了客户端和服务器之间进行通信的规则。它使用请求-响应的模式,客户端发送HTTP请求到服务器,服务器则返回相应的HTTP响应。

      在HTTP中,客户端是发起请求的一方,通常是一个Web浏览器,而服务器是接收请求并提供响应的一方。客户端发送一个由请求方法(如GET、POST、PUT等)和URL组成的请求,包含一些附加的请求头信息(如Host、User-Agent等)。服务器解析请求并返回响应,响应包含一个状态码(如200表示成功、404表示未找到等),响应头信息(如Content-Type、Content-Length等),以及可选的响应体(即实际传输的数据)。

HTTP协议的特点包括:

  • 简单:HTTP的请求和响应是基于文本的,使用简单明了的格式,易于阅读和理解。
  • 无状态:每个请求都是独立的,并不会记住之前的请求状态,每次请求都需要重新验证身份等信息。
  • 可扩展:通过HTTP的头部字段和方法,可以扩展和增加功能。
  • 资源定位:使用URL定位和标识资源。

 对于htpp的请求和响应对是对于的协议格式如下:

 

 

2、htpp基本结构 

2.1认识URL

URL(Uniform Resource Locator,统一资源定位符)是用于标识和定位互联网上资源的字符串格式。它是Web浏览器、Web服务器等互联网应用程序中用来访问资源的标准格式。

基本组成:

 

  1. 协议(Protocol):指定了访问资源所使用的协议,如 HTTP、HTTPS、FTP 等。例如,在 http://https:// 中,httphttps 就是协议。

  2. 主机名(Host):指定了资源所在的主机(服务器)的域名或IP地址。例如,在 https://www.example.com 中,www.example.com 就是主机名。

  3. 端口号(Port):指定了用于访问资源的端口号。端口号是一个可选项,如果未指定,则使用默认端口。例如,在 https://www.example.com:443 中,443 就是端口号。常用的HTTP协议默认端口号是80,HTTPS协议默认端口号是443。

  4. 路径(Path):指定了资源在服务器上的路径。它是资源的具体位置。例如,在 https://www.example.com/path/to/resource 中,/path/to/resource 就是路径。

  5. 查询字符串(Query String):指定了向服务器传递的参数。它以 ? 开头,多个参数之间使用 & 分隔。例如,在 https://www.example.com/search?q=keyword&page=1 中,?q=keyword&page=1 就是查询字符串。

  6. 片段标识符(Fragment Identifier):用于标识资源中的一个特定部分。它以 # 开头。例如,在 https://www.example.com/page#section1 中,#section1 就是片段标识符。

 2.2urlencode和urldecode

urlencodeurlencode 函数是用于将 URL 中的特殊字符转换为 %xx 格式的编码形式,其中 xx 是字符的 ASCII 码的十六进制表示。

我们在网站搜索C++关键字,这时就被 urlencode解析为了c%2B%2B

urldecodeurldecode 函数则是对 URL 编码后的字符串进行解码,将 %xx 格式的编码字符还原为原始字符。 

urldecode就是urlencode的逆过程;

2.3其他属性

HTTP的方法:

GET 方法和 POST 方法是 HTTP 协议中最常用的两种请求方法,它们之间有以下几个主要区别:

  1. 数据传输方式

    • GET 方法:通过 URL 向服务器传递数据。数据被包含在 URL 的查询字符串中,以 ? 开头,多个参数之间使用 & 分隔。因此,GET 请求的数据在 URL 中是可见的,可以被用户和其他应用程序轻易看到。
    • POST 方法:通过 HTTP 请求体向服务器传递数据。数据不会显示在 URL 中,而是以表单形式隐式地传递给服务器。因此,POST 请求的数据对于用户来说是不可见的。
  2. 数据长度限制

    • GET 方法:由于数据是作为 URL 的一部分传递的,所以传输的数据量受到 URL 长度的限制,不同浏览器和服务器对 URL 长度的限制不同,通常在 2KB 到 8KB 之间。
    • POST 方法:由于数据是通过请求体传递的,所以数据量通常没有明确的限制,但是服务器和应用程序可能会设置最大允许的请求体大小
  3. 安全性

    • GET 方法:由于数据在 URL 中可见,因此不适合传输敏感数据,如密码等,因为敏感数据容易被截获或篡改。
    • POST 方法:由于数据不会显示在 URL 中,因此更适合传输敏感数据,提供了更高的安全性。
  4. 可缓存性

    • GET 方法:请求可被缓存,如果相同的请求再次发送,则可能从缓存中获取响应,以提高性能。
    • POST 方法:请求通常不会被缓存,因为它们可能对服务器产生更改或副作用。

注意:POST虽然比GET安全点,但是并不意味着他是安全的 

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)

HTTP常见Header

  • Content-Type: 数据类型(text/html等);
  • Content-Length: Body的长度;
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

二、基于Http服务器 

实现一个最简单的HTTP服务器, 只在网页上输出 "自己定义的内容"; 按照HTTP协议的要求构造数据,更好的理解htpp服务器。

1、htppserver服务器

htppserver.hpp 

#pragma once#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include "Protocol.hpp"namespace server
{enum{USAGE_ERR = 1,SOCKET_ERR,BIND_ERR,LISTEN_ERR};static const uint16_t gport = 8080;static const int gbacklog = 5;using func_t = std::function<bool(const HttpRequest &, HttpResponse &)>;class HttpServer{public:HttpServer(func_t func, const uint16_t &port = gport) : _func(func), _listensock(-1), _port(port){}void initServer(){// 1. 创建socket文件套接字对象_listensock = socket(AF_INET, SOCK_STREAM, 0);if (_listensock < 0){exit(SOCKET_ERR);}// 2. bind绑定自己的网络信息struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY;if (bind(_listensock, (struct sockaddr *)&local, sizeof(local)) < 0){exit(BIND_ERR);}// 3. 设置socket 为监听状态if (listen(_listensock, gbacklog) < 0) // 第二个参数backlog后面在填这个坑{exit(LISTEN_ERR);}}void HandlerHttp(int sock){// 1. 读到完整的http请求// 2. 反序列化// 3. httprequst, httpresponse, _func(req, resp)// 4. resp序列化// 5. sendchar buffer[4096];HttpRequest req;HttpResponse resp;size_t n = recv(sock, buffer, sizeof(buffer) - 1, 0); // 大概率我们直接就能读取到完整的http请求if (n > 0){buffer[n] = 0;req.inbuffer = buffer;req.parse();_func(req, resp); // req -> respsend(sock, resp.outbuffer.c_str(), resp.outbuffer.size(), 0);}}void start(){for (;;){// 4. server 获取新链接// sock, 和client进行通信的fdstruct sockaddr_in peer;socklen_t len = sizeof(peer);int sock = accept(_listensock, (struct sockaddr *)&peer, &len);if (sock < 0){continue;}// version 2 多进程版(2)pid_t id = fork();if (id == 0) // child{close(_listensock);if (fork() > 0)exit(0);HandlerHttp(sock);close(sock);exit(0);}close(sock);// fatherwaitpid(id, nullptr, 0);}}~HttpServer() {}private:int _listensock; // 不是用来进行数据通信的,它是用来监听链接到来,获取新链接的!uint16_t _port;func_t _func;};} // namespace server

 htppserver.cc

#include "HttpServer.hpp"
#include <memory>using namespace std;
using namespace server;void Usage(std::string proc)
{cerr << "Usage:\n\t" << proc << " port\r\n\r\n";
}// 文件后缀来生成相应的 Content-Type 字符串
std::string suffixToDesc(const std::string suffix)
{std::string ct = "Content-Type: ";if (suffix == ".html")ct += "text/html";else if (suffix == ".jpg")ct += "application/x-jpg"; // application申请ct += "\r\n";return ct;
}
//  1. 服务器和网页分离,html
//  2. url -> / : web根目录
bool Get(const HttpRequest &req, HttpResponse &resp)
{// for testcout << "----------------------http start---------------------------" << endl;cout << req.inbuffer << std::endl;std::cout << "method: " << req.method << std::endl;std::cout << "url: " << req.url << std::endl;std::cout << "httpversion: " << req.httpversion << std::endl;std::cout << "path: " << req.path << std::endl;std::cout << "suffix: " << req.suffix << std::endl;std::cout << "size: " << req.size << "字节" << std::endl;cout << "----------------------http end---------------------------" << endl;std::string respline = "HTTP/1.1 200 OK\r\n";std::string respheader = "Content-Type: text/html\r\n";respheader += "Set-Cookie: name=1234567abcdefg; Max-age=120\r\n"; // 这个 Cookie 的最大有效期是 120 秒。std::string respblank = "\r\n";// std::string body = "<html lang=\"en\"><head><meta charset=\"UTF-8\"><title>for test</title><h1>hello world</h1></head><body><p>北京交通广播《一路畅通》“交通大家谈”节目,特邀北京市交通委员会地面公交运营管理处处长赵震、北京市公安局公安交通管理局秩序处副处长 林志勇、北京交通发展研究院交通规划所所长 刘雪杰为您解答公交车专用道6月1日起社会车辆进出公交车道须注意哪些?</p></body></html>";std::string body;body.resize(req.size + 1);if (!Util::readFile(req.path, (char *)body.c_str(), req.size))Util::readFile(html_404, (char *)body.c_str(), req.size);respheader += "Content-Length";respheader += std::to_string(body.size());respheader += "\r\n";resp.outbuffer += respline;resp.outbuffer += respheader;resp.outbuffer += respblank;cout << "----------------------http response start---------------------------" << endl;std::cout << resp.outbuffer << std::endl;cout << "----------------------http response end---------------------------" << endl;resp.outbuffer += body;return true;
}// ./httpServer 8080
int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(0);}uint16_t port = atoi(argv[1]);unique_ptr<HttpServer> httpsvr(new HttpServer(Get, port));httpsvr->initServer();httpsvr->start();return 0;
}

2、Protool.hpp 

服务器的请求和响应 

#pragma once#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>#include "Util.hpp"const std::string sep = "\r\n";
const std::string default_root = "./wwwroot";
const std::string home_page = "index.html";
const std::string html_404 = "wwwroot/404.html";class HttpRequest
{
public:HttpRequest() {}~HttpRequest() {}void parse(){// 1. 从inbuffer中拿到第一行,分隔符\r\nstd::string line = Util::getOneLine(inbuffer, sep);if (line.empty())return;// 2. 从请求行中提取三个字段// std::cout << "line: " << line << std::endl;std::stringstream ss(line);ss >> method >> url >> httpversion; // method方法// 3. 添加web默认路径path = default_root; // ./wwwroot,path += url;         //./wwwroot/a/b/c.html, ./wwwroot/if (path[path.size() - 1] == '/')path += home_page;// 4. 获取path对应的资源后缀// ./wwwroot/index.html// ./wwwroot/test/a.html// ./wwwroot/image/1.jpgauto pos = path.rfind(".");if (pos == std::string::npos)suffix = ".html";elsesuffix = path.substr(pos);// 5 获取资源大小struct stat st; // struct stat 是用于获取文件或文件系统状态信息的结构体int n = stat(path.c_str(), &st);if (n == 0)size = st.st_size;elsesize = -1;}public:std::string inbuffer;// std::string reqline;// std::vector<std::string> reqheader;// std::string body;std::string method;std::string url;std::string httpversion;std::string path;std::string suffix;int size;std::string parm;
};class HttpResponse
{
public:std::string outbuffer;
};

3、Util.hpp 

这里完成文件的读取

#pragma once#include <iostream>
#include <string>
#include <fstream>
#include <fcntl.h>class Util
{
public:// XXXX XXX XXX\r\nYYYYY// 找到空行的出现static std::string getOneLine(std::string &buffer, const std::string &sep){auto pos = buffer.find(sep);if (pos == std::string::npos)return "";std::string sub = buffer.substr(0, pos);buffer.erase(0, sub.size() + sep.size());return sub;}static bool readFile(const std::string resource, char *buffer, int size){std::ifstream in(resource, std::ios::binary); // 读取文件if (!in.is_open())return false;in.read(buffer, size);in.close();return close;}
};

4、wwwroot

 在这里完成网站的设计,这里注意使用的是Html

网站的首页

网页中我们设计二个板块新闻,电商,梅花图片,账号密码的设计 。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>我的首页</title>
</head><body><h1>我是网站的首页</h1><!-- <img src="https://img1.baidu.com/it/u=2812417321,4100104782&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750" alt="石榴花"> --><!-- <a href="http://pic1.win4000.com/wallpaper/c/5799c80de4900.jpg"></a> --><a href="/test/a.html">新闻</a><a href="/test/c.html">电商</a><img src="/image/1.jpg" alt="梅花"><form action="/a/b/c.py" method="POST">姓名:<br><input type="text" name="xname"><br>密码:<br><input type="password" name="ypwd"><br><br><input type="submit" value="登陆"></form>
</body></html>

网站新闻设计

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>a网页</title>
</head><body><h1>我是a网页,负责新闻的入口</h1><a href="/">返回</a>
</body></html>

 网站的电商设计

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>b网页</title>
</head><body><h1>我是b网页,负责电商的入口</h1><a href="/">返回</a>
</body></html>

 网站报错误

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>资源不存在</title>
</head><body><h1>你所访问的资源并不存在,404!</h1>
</body></html>

5、程序运行后的细节

服务器运行后,我们在网站上输入自己的主机号:端口号 

 当我们点击新闻时候,会跳转在新闻网站,这是对应的是Http的长链接

HTTP协议中的长连接(Keep-Alive)是一种在单个TCP连接上可以传送多个HTTP请求和响应的机制。在默认情况下,HTTP/1.0 版本中的每个请求/响应交互都需要建立一个新的TCP连接,处理完成后即关闭连接。而长连接则允许在一次TCP连接中传输多个请求和响应,而不需要每次都重新建立连接。

账号输入密码,我们就可以进行跳转

 Htpp协议的会话保持

HTTP协议的会话保持是一种机制,用于在客户端和服务器之间保持持久的连接状态,使得在多个HTTP请求之间能够保持同一个会话的相关信息。通常,会话保持是通过使用Cookie或者URL重写的方式实现的。

Cookie

  • Cookie 是一种在客户端存储的小型数据片段,由服务器通过 HTTP 响应头发送给客户端,客户端会将其保存起来,在以后的请求中通过 HTTP 请求头发送给服务器。
  • 通过在客户端存储会话标识符等信息,服务器可以在多个HTTP请求之间识别出同一个用户的会话,并保持会话状态。
  • 使用 Cookie 的方式可以实现更加灵活和复杂的会话管理,例如,可以存储用户的登录状态、购物车信息等。

URL 重写

  • URL 重写是一种在URL中包含会话标识符的方式,通过在每个URL后面添加会话标识符参数来实现会话保持。
  • 服务器会将会话标识符作为参数附加在URL后面,客户端在每个请求中都需要将该标识符带回服务器。
  • 虽然URL重写可以实现基本的会话保持,但其缺点是会在URL中暴露会话信息,可能存在安全隐患,并且会导致URL的长度增加,影响可读性。

 

 

Linux命令 

 mv 是 Linux 和 Unix 操作系统中用于移动或重命名文件和目录的命令。它的基本语法如下:

mv [options] source destination

 mv 命令选项包括:

-i, --interactive: 在执行前进行交互式确认,防止覆盖已存在的目标文件。
-u, --update: 仅在源文件比目标文件新或目标文件不存在时才执行移动操作。
-b, --backup[=CONTROL]: 在移动文件前进行备份,可以指定备份的方式,如 -b 或 -b=numbered。
-f, --force: 强制执行移动操作,即使目标文件已存在,也会覆盖。

例子: 

1 将文件从一个目录移动到另一个目录:

mv /path/to/sourcefile /path/to/destination/

2 重命名文件: 

mv oldfile.txt newfile.txt

3 移动并覆盖目标文件

mv -f sourcefile.txt /path/to/destination/

4 移动目录:

mv /path/to/sourcedir /path/to/destination/

 

 

 

 

相关文章:

[计算机网络]---Http协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xf…...

Hexo删除主题

一、找到存放主题的目录 1、一般在入博客中的theme目录&#xff0c;这里以next主题为例。 在theme目录中&#xff0c;打开Git Bash Here&#xff1b; ls 列出主题目录 rm -rf 填需要删除的主题目录 2、另一种情况&#xff0c;以fluid主题为例&#xff1b;之前不知道是用那种…...

RK3399平台开发系列讲解(USB篇)U盘等存储类设备

🚀返回专栏总目录 文章目录 一、什么是U盘等存储类设备二、U盘设备传输数据结构三、U盘识别需要打开的宏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍U盘等存储类设备。 一、什么是U盘等存储类设备 USB Mass Storage Device Class(USB MSC/UMS) USB大容量存…...

一个页面需要加载大量的图片,如何提升用户体验?

当网站页面需要加载大量图片时&#xff0c;优化用户体验非常关键&#xff0c;以下是一些方法来提升用户体验&#xff1a; 图片懒加载&#xff08;Lazy Loading&#xff09;&#xff1a;只加载用户可以看到的图片&#xff0c;当用户向下滚动页面时&#xff0c;再加载其他图片。这…...

JRT监听-PDF-Excel-Img

依赖全新设计&#xff0c;我们无需再顾虑历史兼容性的束缚&#xff1b;同时&#xff0c;基于多年来累积的深入需求理解&#xff0c;JRT监听机制巧妙地借助CMD命令模式&#xff0c;达成了监听的全面统一。无论是PDF、Excel还是图片文件&#xff0c;都不再需要特殊对待或额外区分…...

Pulsar-架构与设计

Pulsar架构与设计 一、背景和起源二、框架概述1.设计特点2.框架适用场景 三、架构图1.Broker2.持久化存储&#xff08;Persistent storage&#xff09;3.Pulsar元数据&#xff08;Metadata store&#xff09; 四、功能特性1.消息顺序性2.消息回溯3.消息去重4.消息重投递5.消息重…...

LeetCode每日一题589. N-ary Tree Preorder Traversal

文章目录 一、题目二、题解 一、题目 Given the root of an n-ary tree, return the preorder traversal of its nodes’ values. Nary-Tree input serialization is represented in their level order traversal. Each group of children is separated by the null value (S…...

html5移动端适配;检测浏览器信息函数

html5移动端适配 //动态改变font-size大小 (function changeFontSize() {let resizeEvt orientationchange in window ? orientationchange : resizeif (!isPC()) {let docEl document.documentElement;// recalc function () {let clientWidth docEl.clientWidth;docEl.…...

go依赖注入库samber/do使用

英语版本 介绍 以简单和高效而闻名的Go语言在其1.18版本中引入了泛型&#xff0c;这可以显着减少大量代码生成的需要&#xff0c;使该语言更加强大和灵活。如果您有兴趣&#xff0c; Go 泛型教程 是很好的学习资源。 通过使用 Go 的泛型&#xff0c;samber/do库为依赖注入 (…...

JMeter 配置元件之按条件读取CSV Data Set Config

实践环境 win10 JMeter 5.4.1 需求描述 需求是这样的&#xff0c;需要压测某个接口(取消分配接口)&#xff0c;请求这个接口之前&#xff0c;需要先登录系统(物流WMS系统)&#xff0c;并在登录后&#xff0c;选择并进入需要操作的仓库&#xff0c;然后请求接口&#xff0c;…...

MySQL跨服务器关联查询

1. 首先确认服务器的Federated引擎是否开启 show engines;修改数据库的配制文件my.ini,(我的my.ini的路径为&#xff1a;D:\ProgramData\MySQL\MySQL Server 5.7/my.ini),将federated添加到my.ini文件中 到MySQL的my.cnf配置文件中修改 在 [mysqld] 下方加入 federated 然后重…...

分库分表浅析

简介 对于任何系统而言&#xff0c;都会设计到数据库随着时间增长而累积越来越多的数据&#xff0c;系统也因为越来越多的需求变迁导致原有的设计不再满足现状&#xff0c;为了解决这些问题&#xff0c;分库分表就会走进视野&#xff0c;带着几个问题走入分库分表。 什么是分…...

java 宠物医院系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 宠物医院系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

XMall 开源商城 SQL注入漏洞复现(CVE-2024-24112)

0x01 产品简介 XMall 开源电商商城 是开发者Exrick的一款基于SOA架构的分布式电商购物商城 前后端分离 前台商城:Vue全家桶 后台管理:Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper等。 0x02 漏洞概述 XMall 开源商城 /item/list、/item/listSearch、/sys/…...

Docker原理及概念相关

Docker最核心的组件 image&#xff1a;镜像&#xff0c;构建容器&#xff0c;也可以通过Dockerfile文本描述镜像的内容。 (我们将应用程序运行所需的环境&#xff0c;打包为镜像文件) Container&#xff1a;容器 (你的应用程序&#xff0c;就跑在容器中 ) 镜像仓库(dockerhub)(…...

Vim相关配置

记录一下有关vim的一些设置&#xff0c;以免电脑寄了不好重新配置 vscodevim 首先是vscode中的vim模式 在应用商店中搜索vim插件安装即可 然后在setting中添加以下有关vim 的配置 "vim.easymotion": true,"vim.surround": true,"vim.incsearch"…...

ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)

在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中&#xff0c;作者对异常处理整体流程以及相关概念做了梳理。接下来&#xff0c;本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。 ARMv8-AArch64 的异常处理模型…...

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

逆向服务器用了三天的时间&#xff0c;但此时觉得一切都值&#xff0c;又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分&#xff0c;上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…...

论文精读--对比学习论文综述

InstDisc 提出了个体判别任务&#xff0c;而且利用这个代理任务与NCE Loss去做对比学习从而得到了不错的无监督表征学习的结果&#xff1b;同时提出了别的数据结构——Memory Bank来存储大量负样本&#xff1b;解决如何对特征进行动量式的更新 翻译&#xff1a; 有监督学习的…...

文章复现 | 差异分析和PPI网络构建

原文链接&#xff1a;差异分析和PPI网路图绘制教程 写在前面 在原文中&#xff0c;作者获得285个DEG&#xff0c;在此推文中共获得601个DEG。小杜的猜想是标准化的水段不同的原因吧&#xff0c;或是其他的原因。此外&#xff0c;惊奇的发现发表医学类的文章在附件中都不提供相…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...