HTTP协议手写服务器

目录

一、请求的是Web根目录

二、GET方法通过URL传参

三、根据资源类型对应出Content-Type值

四、Http代码


项目完整源代码:Http · 周不才/cpp_linux study - 码云 - 开源中国

一、请求的是Web根目录

如果URL中请求的资源是Web根目录,则自动跳转到主页

例如QQ官网https://im.qq.com/,实际访问时会自动跳转到主页https://im.qq.com/index/

实现代码:

static const std::string homePage="index.html";//主页资源
//解析请求的资源路径path,如果请求的是web根目录
if(_path[_path.size()-1]=='/')
{_path+=homePage;
}

二、GET方法通过URL传参

GET方法和POST方法都可以通过表单等方式向服务器传递数据

GET方法会将表单的数据存放到URL中,再发送给服务器。符号?后面就是参数

https://fanyi.baidu.com/mtpe-individual/multimodal?query=%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96&lang=zh2en

POST方法会将表单的数据存放到请求正文中,再发送给服务器

  • POST传参的数据可以很大,因为存放在正文中;GET方法传参的数据一定很小,因为存放在URL中
  • POST传参比GET传参安全,因为GET传参的数据会直接暴露在URL中。但这两种传参方法都不安全,需要对参数加密,即Https协议

提取GET方法传递的参数代码:

static const std::string argSep="?";//URL中参数的位置标识
//解析URL中携带的参数(GET方法)
if(strcasecmp(_method.c_str(),"GET")==0)//请求方法是GET
{auto pos=_url.find(argSep);if(pos!=std::string::npos)//URL中携带参数{_reqContent=_url.substr(pos+argSep.size());//提取URL中的参数,存放到请求正文中_url.resize(pos);//URL中去除参数部分}
}

三、根据资源类型对应出Content-Type值

根据请求后缀,如.html   .jpg   .png   .gif等对应出Content-Type值

//--------------------------------------------------------//建立资源后缀和Http协议中的资源类型之间的映射关系//--------------------------------------------------------_resourceType.insert({".html", "text/html"});_resourceType.insert({".htm", "text/html"});_resourceType.insert({".css", "text/css"});_resourceType.insert({".txt", "text/plain"});_resourceType.insert({".md", "text/markdown"});// 脚本类_resourceType.insert({".js", "application/javascript"});_resourceType.insert({".mjs", "application/javascript"});// 图像类_resourceType.insert({".jpg", "image/jpeg"});_resourceType.insert({".jpeg", "image/jpeg"});_resourceType.insert({".png", "image/png"});_resourceType.insert({".gif", "image/gif"});_resourceType.insert({".webp", "image/webp"});_resourceType.insert({".svg", "image/svg+xml"});_resourceType.insert({".ico", "image/x-icon"});// 字体类_resourceType.insert({".woff", "font/woff"});_resourceType.insert({".woff2", "font/woff2"});_resourceType.insert({".ttf", "font/ttf"});// 多媒体类_resourceType.insert({".mp3", "audio/mpeg"});_resourceType.insert({".wav", "audio/wav"});_resourceType.insert({".mp4", "video/mp4"});_resourceType.insert({".webm", "video/webm"});// 文档类_resourceType.insert({".pdf", "application/pdf"});_resourceType.insert({".doc", "application/msword"});_resourceType.insert({".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"});_resourceType.insert({".xls", "application/vnd.ms-excel"});_resourceType.insert({".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});_resourceType.insert({".ppt", "application/vnd.ms-powerpoint"});_resourceType.insert({".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"});// 压缩包类_resourceType.insert({".zip", "application/zip"});_resourceType.insert({".tar", "application/x-tar"});_resourceType.insert({".gz", "application/gzip"});// 数据格式类_resourceType.insert({".json", "application/json"});_resourceType.insert({".xml", "application/xml"});_resourceType.insert({".csv", "text/csv"});// 二进制流默认类型_resourceType.insert({".bin", "application/octet-stream"});
大类Content-Type值描述
文本类型text/plain纯文本,无格式(如TXT文件)
text/htmlHTML文档,用于网页
text/cssCSS样式表
text/javascriptJavaScript代码(旧标准,推荐使用 application/javascript
text/markdownMarkdown格式文本
图像类型image/jpegJPEG图像
image/pngPNG图像
image/gifGIF图像(支持动画)
image/webpWebP格式图像(现代高效压缩格式)
image/svg+xmlSVG矢量图(基于XML)
应用程序类型application/jsonJSON格式数据,常用于API交互
application/xmlXML数据
application/pdfPDF文档
application/octet-stream二进制流(如文件下载)
application/x-www-form-urlencoded表单提交的默认编码格式
application/zipZIP压缩文件
application/javascriptJavaScript代码(现代标准)
application/wasmWebAssembly模块(用于高性能Web应用)
多媒体类型audio/mpegMP3音频文件
audio/wavWAV音频文件
video/mp4MP4视频文件
video/webmWebM开放格式视频
多部分类型multipart/form-data表单文件上传(支持二进制数据)
multipart/byteranges分块传输响应(用于HTTP范围请求)
字体类型font/woffWeb开放字体格式(WOFF 1.0)
font/woff2WOFF 2.0字体(更高压缩率)
其他类型application/vnd.ms-excelExcel文件(旧版,如 .xls
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet新版Excel文件(.xlsx

四、Http代码

//应用层协议:HTTP协议#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <cstring>//提供strcasecmp,忽略大小写比较字符串
#include <memory>//智能指针
#include <fstream>//文件操作static const std::string baseSep="\r\n";//行与行之间的分隔符
static const std::string lineSep=" ";//请求行中各个属性的分隔符
static const std::string argSep="?";//URL中参数的位置标识
static const std::string homePage="index.html";//主页资源
static const std::string suffixSep=".";//资源后缀符号
static const std::string headerSep=": ";//单个报头属性之间的分隔符
static const std::string webRootDir="wwwroot";//Web根目录(path初始值即为web根目录)
static const std::string httpVersion="HTTP/1.0";//默认的Http协议版本(用于响应)//Http请求
class HttpRequest
{
private://Http协议请求的基本属性std::string _reqLine;//请求行std::vector<std::string> _reqHeaders;//请求报头std::string _blankLine;//空行std::string _reqContent;//请求正文//Http协议请求的详细属性std::string _method;//请求方法std::string _url;//请求资源的路径URLstd::string _version;//Http版本std::unordered_map<std::string,std::string> _reqHeadersKV;//请求报头属性集合(请求报头的各种属性存储在哈希表中)std::string _path;//URL只是相对路径,要根据资源所在位置确定绝对路径std::string _suffix;//资源后缀,用于确定请求的资源是什么类型,以便填充请求报头中的Content-Type属性
public://构造函数HttpRequest():_blankLine(baseSep),_path(webRootDir){}//析构函数~HttpRequest(){}
private://解析请求协议,获取单行数据(目的是将请求行、请求报头、请求正文拆分开)std::string GetLine(std::string& reqstr){auto pos=reqstr.find(baseSep);//查找\r\nif(pos!=std::string::npos){std::string line=reqstr.substr(0,pos);reqstr.erase(0,pos+baseSep.size());if(line.empty()) return baseSep;//如果获取一行的内容是空,说明该行是空行,返回\r\nelse return line;//否则返回正常获取的一行数据}else{return std::string();}}//解析请求行void ParseReqLine(){//将请求行解析为请求方法、URL、http版本std::stringstream ss(_reqLine);//按空格为分隔符ss>>_method>>_url>>_version;//--------------------------------------------------------------//更详细地解析URL,以提取参数、初始化path、初始化资源后缀suffix//1.提取参数//解析URL中携带的参数(GET方法)if(strcasecmp(_method.c_str(),"GET")==0)//请求方法是GET{auto pos=_url.find(argSep);if(pos!=std::string::npos)//URL中携带参数{_reqContent=_url.substr(pos+argSep.size());//提取URL中的参数,存放到请求正文中_url.resize(pos);//URL中去除参数部分}}//2.初始化path//初始化请求的资源路径path(绝对路径)_path+=_url;//解析请求的资源路径path,如果请求的是web根目录if(_path[_path.size()-1]=='/'){_path+=homePage;}//3.初始化资源后缀suffixauto pos=_path.rfind(suffixSep);if(pos!=std::string::npos){_suffix=_path.substr(pos);}else{_suffix=".default";}}//解析请求报头void ParseReqHeaders(){//将报头属性存储到哈希表中for(auto& reqHeader:_reqHeaders){auto pos=reqHeader.find(headerSep);if(pos!=std::string::npos){std::string k=reqHeader.substr(0,pos);std::string v=reqHeader.substr(pos+headerSep.size());if(k.empty()||v.empty()) continue;_reqHeadersKV[k]=v;}else{continue;}}}
public://反序列化:序列化字符串➡基本属性➡详细属性void Deserialize(std::string& reqstr){//基本的反序列化:拆分reqstr为请求行、请求报头、空行、请求正文//请求行_reqLine=GetLine(reqstr);//请求报头  todo1std::string reqHeader;while((reqHeader=GetLine(reqstr))!=baseSep){_reqHeaders.emplace_back(reqHeader);}//空行_blankLine=baseSep;//请求正文  todo2_reqContent=reqstr;//---------------------------------------------//进一步反序列化:解析请求行、请求报头为更详细的属性ParseReqLine();ParseReqHeaders();}//获取路径std::string GetPath(){return _path;}//获取正文内容std::string GetReqContent(){return _reqContent;}//获取资源后缀std::string GetSuffix(){return _suffix;}//输出反序列化结果void Print(){std::cout<<"-----------------------------------------"<<std::endl;std::cout<<"请求行:"<<_reqLine<<std::endl;std::cout<<"请求方法:"<<_method<<std::endl;std::cout<<"URL:"<<_url<<std::endl;std::cout<<"Http版本:"<<_version<<std::endl;for(auto& reqHeader: _reqHeaders){std::cout<<"请求报头:"<<reqHeader<<std::endl;}std::cout<<"空行:"<<_blankLine;std::cout<<"请求正文"<<_reqContent<<std::endl;}
};//Http应答
class HttpResponse
{
private://Http协议响应的基本属性std::string _statusLine;//状态行std::vector<std::string> _resHeaders;//响应报头std::string _blankLine;//空行std::string _resContent;//响应正文//Http协议响应的详细属性std::string _version;//http版本int _statusCode;//状态码std::string _statusDescribe;//状态码描述std::unordered_map<std::string,std::string> _resHeadersKV;//响应报头属性集合
public://构造函数HttpResponse():_blankLine(baseSep),_version(httpVersion){}//析构函数~HttpResponse(){}
public://序列化std::string Serialize(){//构建状态行_statusLine+=_version+lineSep+std::to_string(_statusCode)+lineSep+_statusDescribe+baseSep;//构建应答报头for(auto& resHeader: _resHeadersKV){_resHeaders.emplace_back(resHeader.first+headerSep+resHeader.second+baseSep);}//正式序列化:详细属性➡基本属性➡序列化字符串std::string responseStr=_statusLine;//加上状态行for(auto& resHeader:_resHeaders)//加上响应报头{responseStr+=resHeader;}responseStr+=_blankLine;//加上空行responseStr+=_resContent;//加上响应正文return responseStr;}//设置属性//设置状态码和状态码描述void AddStatusCodeAndDescribe(int statusCode, const std::string& statusDescribe){_statusCode=statusCode;_statusDescribe=statusDescribe;}//添加报头属性void AddHeader(const std::string& k, const std::string& v){_resHeadersKV[k]=v;}//添加应答正文void AddResContent(const std::string& resContent){_resContent=resContent;}
}; //Http处理(将请求处理为应答)
class HttpServer
{
private:std::unordered_map<std::string,std::string> _resourceType;//资源类型(根据后缀,判定资源类型)std::unordered_map<int,std::string> _codeToDescribe;//状态码-状态码描述std::unordered_map<std::string,std::function<HttpResponse(HttpRequest)>> _serviceLists;//服务列表
public://构造函数HttpServer(){//--------------------------------------------------------//建立资源后缀和Http协议中的资源类型之间的映射关系//--------------------------------------------------------_resourceType.insert({".html", "text/html"});_resourceType.insert({".htm", "text/html"});_resourceType.insert({".css", "text/css"});_resourceType.insert({".txt", "text/plain"});_resourceType.insert({".md", "text/markdown"});// 脚本类_resourceType.insert({".js", "application/javascript"});_resourceType.insert({".mjs", "application/javascript"});// 图像类_resourceType.insert({".jpg", "image/jpeg"});_resourceType.insert({".jpeg", "image/jpeg"});_resourceType.insert({".png", "image/png"});_resourceType.insert({".gif", "image/gif"});_resourceType.insert({".webp", "image/webp"});_resourceType.insert({".svg", "image/svg+xml"});_resourceType.insert({".ico", "image/x-icon"});// 字体类_resourceType.insert({".woff", "font/woff"});_resourceType.insert({".woff2", "font/woff2"});_resourceType.insert({".ttf", "font/ttf"});// 多媒体类_resourceType.insert({".mp3", "audio/mpeg"});_resourceType.insert({".wav", "audio/wav"});_resourceType.insert({".mp4", "video/mp4"});_resourceType.insert({".webm", "video/webm"});// 文档类_resourceType.insert({".pdf", "application/pdf"});_resourceType.insert({".doc", "application/msword"});_resourceType.insert({".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"});_resourceType.insert({".xls", "application/vnd.ms-excel"});_resourceType.insert({".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});_resourceType.insert({".ppt", "application/vnd.ms-powerpoint"});_resourceType.insert({".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"});// 压缩包类_resourceType.insert({".zip", "application/zip"});_resourceType.insert({".tar", "application/x-tar"});_resourceType.insert({".gz", "application/gzip"});// 数据格式类_resourceType.insert({".json", "application/json"});_resourceType.insert({".xml", "application/xml"});_resourceType.insert({".csv", "text/csv"});// 二进制流默认类型_resourceType.insert({".bin", "application/octet-stream"});//--------------------------------------------------------// 建立状态码和状态码描述之间的映射关系//--------------------------------------------------------// 1xx 信息响应_codeToDescribe.insert(std::make_pair(100, "Continue"));_codeToDescribe.insert(std::make_pair(101, "Switching Protocols"));_codeToDescribe.insert(std::make_pair(102, "Processing"));// 2xx 成功_codeToDescribe.insert(std::make_pair(200, "OK"));_codeToDescribe.insert(std::make_pair(201, "Created"));_codeToDescribe.insert(std::make_pair(202, "Accepted"));_codeToDescribe.insert(std::make_pair(204, "No Content"));_codeToDescribe.insert(std::make_pair(206, "Partial Content"));// 3xx 重定向_codeToDescribe.insert(std::make_pair(300, "Multiple Choices"));_codeToDescribe.insert(std::make_pair(301, "Moved Permanently"));_codeToDescribe.insert(std::make_pair(302, "Found"));_codeToDescribe.insert(std::make_pair(304, "Not Modified"));_codeToDescribe.insert(std::make_pair(307, "Temporary Redirect"));_codeToDescribe.insert(std::make_pair(308, "Permanent Redirect"));// 4xx 客户端错误_codeToDescribe.insert(std::make_pair(400, "Bad Request"));_codeToDescribe.insert(std::make_pair(401, "Unauthorized"));_codeToDescribe.insert(std::make_pair(403, "Forbidden"));_codeToDescribe.insert(std::make_pair(404, "Not Found"));_codeToDescribe.insert(std::make_pair(405, "Method Not Allowed"));_codeToDescribe.insert(std::make_pair(408, "Request Timeout"));_codeToDescribe.insert(std::make_pair(413, "Payload Too Large"));_codeToDescribe.insert(std::make_pair(415, "Unsupported Media Type"));_codeToDescribe.insert(std::make_pair(429, "Too Many Requests"));// 5xx 服务端错误_codeToDescribe.insert(std::make_pair(500, "Internal Server Error"));_codeToDescribe.insert(std::make_pair(501, "Not Implemented"));_codeToDescribe.insert(std::make_pair(502, "Bad Gateway"));_codeToDescribe.insert(std::make_pair(503, "Service Unavailable"));_codeToDescribe.insert(std::make_pair(504, "Gateway Timeout"));_codeToDescribe.insert(std::make_pair(505, "HTTP Version Not Supported"));}
private://获取文件资源std::string GetResource(const std::string& path){std::ifstream file(path, std::ios::binary);//二进制方式打开path路径下的文件if(!file.is_open())//文件打开失败{return std::string();}file.seekg(0,file.end);//移动输入流指针到文件末尾int fileSize=file.tellg();//获取当前输入流指针位置,即获取文件大小file.seekg(0,file.beg);//回复输入流指针到文件开头std::string resource;resource.resize(fileSize);file.read((char *)resource.c_str(),fileSize);//读取文件资源内容存放到resource中file.close();//关闭文件return resource;}
public://处理服务端接收到的Http请求,最后返回Http应答序列化后的字符串std::string Handle(std::string reqstr){//参数说明:reqstr是客户端序列化过的Http请求HttpRequest req;req.Deserialize(reqstr);//反序列化//处理Http请求,转为Http应答HttpResponse res;if(req.GetPath()=="wwwroot/redir")//处理重定向,重定向到qq官网{std::string redirPath="https://www.qq.com";res.AddStatusCodeAndDescribe(301,_codeToDescribe[301]);res.AddHeader("Location",redirPath);}else if(!req.GetReqContent().empty())//处理参数,如果请求正文不为空,说明传递了参数,请求的不是资源,而是某个服务,要进行服务处理{if(_serviceLists.find(req.GetPath())!=_serviceLists.end()){res=_serviceLists[req.GetPath()](req);//该服务是一个处理函数,参数是req,返回值是res}}else//既没有重定向,也没有请求服务,那么直接进行序列化并返回请求的资源{std::string resource=GetResource(req.GetPath());//获取请求资源的内容if(resource.empty())//说明没有该资源,返回404.html资源{resource=GetResource("wwwroot/404.html");res.AddStatusCodeAndDescribe(404,_codeToDescribe[404]);res.AddHeader("Content-Length",std::to_string(resource.size()));res.AddHeader("Content-Type",_resourceType[".html"]);res.AddResContent(resource);}else{res.AddStatusCodeAndDescribe(200,_codeToDescribe[200]);res.AddHeader("Content-Length", std::to_string(resource.size()));res.AddHeader("Content-Type", _resourceType[req.GetSuffix()]);//res.AddHeader("Set-Cookie", "username=zhangsan");  //Cookieres.AddResContent(resource);}}return res.Serialize();//返回Http应答序列化后的字符串}//添加处理服务(当Http请求中携带参数时,说明其要请求的是某个服务,而不是资源)void InsertService(const std::string& serviceName, std::function<HttpResponse(HttpRequest)> service){_serviceLists.insert(std::make_pair(serviceName+webRootDir,service));}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/74052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小蓝和钥匙

错位排序组合数 从28个人里面选14个人分到原来房间的钥匙 C 28 14 另外14个人错位排序 模板 请在此处填写你的解题思路 D14 都是模板记住就好了 无需理解 做题可以看出来是错位排序 或者组合数 然后会写代码就行了 import java.util.Scanner;/*** author zb* date2025/3…

使用飞书API自动化更新共享表格数据

飞书API开发之自动更新共享表格 天马行空需求需求拆解1、网站数据爬取2、飞书API调用2.1 开发流程2.2 创建应用2.3 配置应用2.4 发布应用2.5 修改表格权限2.6 获取tenant_access_token2.7 调用API插入数据 总结 天马行空 之前一直都是更新的爬虫逆向内容&#xff0c;工作中基本…

Python-Django入手

18.1 建立项目 18.1.1 制定规范 - 定义项目目标&#xff1a;明确应用的核心功能 - 创建项目文档&#xff1a;用README.md记录技术栈和开发流程 - 规划目录结构&#xff1a;建议遵循Django官方推荐的项目布局 18.1.2 建立虚拟环境 在命令行执行&#xff1a; python -m ven…

LangChain4j 入门(二)

LangChain 整合 SpringBoot 下述代码均使用 阿里云百炼平台 提供的模型。 创建项目&#xff0c;引入依赖 通过 IDEA 创建 SpringBoot 项目&#xff0c;并引入 Spring Web 依赖&#xff0c;SpringBoot 推荐使用 3.x 版本。 引入 LangChain4j 和 WebFlux 依赖 <!--阿里云 D…

3.30学习总结 Java包装类+高精度算法+查找算法

包装类&#xff1a; 基本数据类型对应的引用数据类型。 基本数据类型&#xff1a;在内存中记录的是真实的值。 八种包装类的父类都是Object类。 对象之间不能直接进行计算。 JDK5之后可以把int和integer看成一个东西&#xff0c;因为会进行内部优化。自动装箱和自动拆箱。 …

centos 7 LVM管理命令

物理卷&#xff08;PV&#xff09;管理命令 pvcreate&#xff1a;用于将物理磁盘分区或整个磁盘创建为物理卷。 示例&#xff1a;sudo pvcreate /dev/sdb1 解释&#xff1a;将 /dev/sdb1 分区创建为物理卷。 pvdisplay&#xff1a;显示物理卷的详细信息&#xff0c;如大小、所属…

借助FastAdmin和uniapp,高效搭建AI智能平台

在数字化办公时代&#xff0c;效率与协作是企业发展的核心竞争力。传统的办公工具虽然功能丰富&#xff0c;但在面对复杂多变的团队协作需求时&#xff0c;往往显得力不从心。为了解决这一痛点&#xff0c;我们推出了一款全新的办公AI平台&#xff0c;它不仅能够满足文字和语音…

项目上传github——SSH连接配置文档

1. 检查是否已有 SSH 密钥 打开终端&#xff0c;检查是否已经存在 SSH 密钥对&#xff1a; ls ~/.ssh如果你看到类似 id_rsa 和 id_rsa.pub 的文件&#xff0c;说明你已经有 SSH 密钥。否则&#xff0c;继续下一步。 2. 生成 SSH 密钥 如果你没有 SSH 密钥&#xff0c;使用…

传奇类网游页游2.5D游戏场景地图素材Eagle库 沙漠沙海隔壁

传奇类网游页游2.5D游戏场景地图素材Eagle库 沙漠沙海隔壁 链接: https://pan.baidu.com/s/1GY8N-KEkHBGEbS7uxrE4Dg 提取码: yrs8 备用下载地址&#xff1a;http://pan.1234f.com:5212/s/rLzIp 电子资料文档&#xff1a;https://www.1234f.com/sj/GitHub/sucai/20250327/1323…

通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍&#xff1a; DMA控制器可以生成单次传输或增量突发传输&#xff0c;传输的节拍数为4、8或16。 为了确保数据一致性&#xff0c;构成突发传输的每组传输都是不可分割的&#xff1a;AHB传输被锁定&#xff0c;AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备…

鸿蒙学习手册(HarmonyOSNext_API16)_数据持久化③:关系型数据库

概述 关系型数据库&#xff1a;像“Excel表格联合作战”的管家 关系型数据库就像一个超级智能的表格管理系统&#xff0c;专门处理数据之间有复杂关联的情况。比如学生和成绩、订单和商品、用户和评论——这些数据像蜘蛛网一样相互连接&#xff0c;用键值数据库的“独立抽屉”…

Windows 11 VS Code C/C++ 开发环境搭建——一种尽量“绿色”的方法

我的电脑是Windows 11 系统&#xff0c;安装了Visual Studio Code&#xff0c;在上面搭建C/C开发环境&#xff0c;当然&#xff0c;这需要用到MinGW之流了。作为一个绿色爱好者&#xff08;帽子除外&#xff09;&#xff0c;我也尽量绿色地架设这样一个环境…… 第一步&#x…

mysql-分区和性能

mysql自身只支持表的横向分区。 常听到开发人员说“”对表做个分区“&#xff0c;然后数据的查询就会快了。这是真的吗&#xff1f;实际上可能跟根本感觉不到查询速度的提升&#xff0c;甚至会发现查询速度急剧下降。因此&#xff0c;在合理使用分区之前&#xff0c;必须了解分…

DeepSeek协助优化-GTX750Ti文物显卡0.65秒卷完400MB float 音频512阶时域FIR

文章目录 1. 学习目的2. 阶段成果2.1 NVVP 性能探查2.2 测试编译环境2.3 测试样例 3 学习过程3.1 提问DeepSeek3.2 最终代码 4. 体会 1. 学习目的 最近在学习cuda&#xff0c;准备给我的taskBus SDR添加CUDA的模块支持&#xff0c;以便可以用PC机压榨山寨 B210那56M的带宽。 因…

RabbitMQ高级特性--TTL和死信队列

目录 1.TTL 1.1设置消息的TTL 1.1.1配置交换机&队列 1.1.2发送消息 1.1.3运行程序观察结果 1.2设置队列的TTL 1.2.1配置队列和交换机的绑定关系 1.2.2发送消息 1.2.3运行程序观察结果 1.3两者区别 2.死信队列 2.1 声名队列和交换机 2.2正常队列绑定死信交换机 …

【JavaEE】UDP数据报套接字编程

目录 网络编程基础 基本概念 发送端和接收端 请求和响应 客户端和服务端 常见的客户端服务端模型 Socket套接字 TCP/UDP特点 Java数据报套接字通信模型(UDP通信) UDP数据报套接字编程 DatagramSocket 1.类定义 2.构造方法 3.核心方法 4.特性说明 DatagramPacke…

Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理

在现代企业级应用开发中&#xff0c;前后端分离已成为主流模式&#xff0c;前端负责界面呈现&#xff0c;后端专注提供 RESTful API 接口。然而&#xff0c;接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3&#xff0c;为开发者…

构建大语言模型应用:数据准备(第二部分)

本专栏通过检索增强生成&#xff08;RAG&#xff09;应用的视角来学习大语言模型&#xff08;LLM&#xff09;。 本系列文章 简介数据准备&#xff08;本文&#xff09;句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 如上…

Linux 随机数据生成

目录 一. /dev/urandom1.1 dd 命令1.2 head命令1.3 随机字母 二. openssl 命令三. yes命令 一. /dev/urandom ⏹/dev/urandom 是 Linux 和 Unix 系统中的一个特殊文件&#xff0c;它是一个伪随机数生成器&#xff0c;用于提供高吞吐量的随机数据。 1.1 dd 命令 bs1M count10…

项目如何安装本地tgz包并配置局部registry

一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤&#xff1a; 1. 全局配置 如果你希望对所有项目生效&#xff0c;可以将这行配置添加到全局.npmr…