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

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协议手写服务器

目录 一、请求的是Web根目录 二、GET方法通过URL传参 三、根据资源类型对应出Content-Type值 四、Http代码 项目完整源代码&#xff1a;Http 周不才/cpp_linux study - 码云 - 开源中国 一、请求的是Web根目录 如果URL中请求的资源是Web根目录&#xff0c;则自动跳转到主…...

Uni-app入门到精通:subPackages节点为小程序的分包加载配置

subPackages节点用于为小程序的分包加载配置。因小程序有体积和资源加载限制&#xff0c;各小程序平台提供了分包方式&#xff0c;以加快小程序的下载和启动速度。主包用于放置默认启动页面、babBar页面&#xff0c;以及一些所有分包都会用到的公共资源或JS脚本&#xff1b;而分…...

DeepSeek本地部署(linux)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …...

工具——(常用的软件)视频编辑器

软件工具 1、视频编辑器&#xff1a;filmora 9 2、图标无损放大&#xff1a;oCam 或者 Adobe Illustrator CS6 3、图片编辑&#xff1a;Photoshop CS6 4、截图置顶工具&#xff1a;Snipaste 或者 PixPin 5、抢票&#xff1a;Bypass 6、文本日志工具&#xff1a;N…...

Kafka 多线程开发消费者实例

目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构&#xff0c;那实在是有点暴殄天物了。不过&#xff0c;Kafka …...

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个&#xff0c;打包时跳过测试代码...

在Ubuntu中固定USB设备的串口号

获取设备信息 lsusb # 记录设备的Vendor ID和Product ID&#xff08;例如&#xff1a;ID 0403:6001&#xff09;# 获取详细属性&#xff08;替换X和Y为实际设备号&#xff09; udevadm info -a /dev/ttyUSBX 结果一般如下 创建udev规则文件 sudo gedit /etc/udev/rules.d/us…...

Java后端开发: 如何安装搭建Java开发环境《安装JDK》和 检测JDK版本

文章目录 一、JDK的安装1、 打开 Oracle 官方网址2、点击产品 二、检测JDK是否安装成功以及JDK版本的查看1. 打开命令行窗口检测是否安装成功查看 JDK 版本 一、JDK的安装 1、 打开 Oracle 官方网址 Oracle官网地址:https://www.oracle.com/cn/ 2、点击产品 打开下载的JDK文件…...

AudioFlinger与AudioPoliceManager初始化流程

AF/APF启动流程 在启动AudioSeriver服务的过程中会对启动AF/APF。main_audioserver.cpp有如下代码&#xff1a; AudioFlinger::instantiate();AudioPolicyService::instantiate();AF初始化流程 1.AudioFlinger::instantiate() 1.1 AudioFlinger构造函数 void AudioFlinger:…...

Keepalive+LVS+Nginx+NFS高可用架构

KeepaliveLVSNginxNFS高可用架构 1. NFS 业务服务器&#xff08;192.168.98.138&#xff09;2. Web服务集群&#xff08;搭建RS服务器&#xff09;开机自启动自动挂载配置nginx&#xff08;为了区分Web1与Web2访问的文件内容&#xff09; 3. LVS主机&#xff08;Keepalivedlvs&…...

SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解

一、架构设计与技术选型 典型分布式订单系统架构&#xff1a; [网关层] → [订单服务] ←→ [分布式缓存]↑ ↓ [用户服务] [支付服务]↓ ↓ [MySQL集群] ← [分库分表中间件]技术栈组合&#xff1a; Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…...

ctfshow WEB web8

首先确定注入点&#xff0c;输入以下payload使SQL恒成立 ?id-1/**/or/**/true 再输入一下payload 使SQL恒不成立 ?id-1/**/or/**/false 由于SQL恒不成立, 数据库查询不到任何数据, 从而导致页面空显示 由以上返回结果可知&#xff0c;该页面存在SQL注入&#xff0c;注入点…...

当AI代写作业成为常态:重构智能时代的教育范式

2023年春季,某重点高中教师发现全班35%的作文呈现相似AI生成特征;同年国际数学竞赛中,参赛选手使用AI解题引发伦理争议。当GPT-4在SAT考试中取得1520分,当Claude3能撰写专业学术论文,教育领域正面临百年未有之大变革。这场技术革命倒逼我们重新思考:在AI能完成知识性任务…...

基于杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、杜鹃鸟鲶鱼优化算法 杜鹃鸟鲶鱼优化&#xff08;Cuckoo Catfish Optimizer&#xff0c;CCO&#xff09;算法模拟了杜鹃鸟鲶鱼的搜索、捕食和寄生慈鲷行为。该算法的早期迭代侧重于执行多维包络搜索策略和压缩空间策略&#xff0c;并结合辅助搜索策略来有效限制慈鳔的逃逸空…...

Ubuntu 22.04.5 LTS 设置时间同步 ntp

提示&#xff1a;文章为操作记录&#xff0c;以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步&#xff0c;环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…...

搭建前端环境和后端环境

搭建前端环境 ①、安装vscode&#xff0c;并安装相应的插件工具 ②、安装node.js&#xff0c;可以选择当前版本&#xff0c;或者其他版本 ③、创建工作区 创建一个空文件夹&#xff0c;然后通过vscode工具打开&#xff0c;保存为后缀名为.code-workspace ④、从gitee…...

【VirtualBox 安装 Ubuntu 22.04】

网上教程良莠不齐&#xff0c;有一个CSDN的教程虽然很全面&#xff0c;但是截图冗余&#xff0c;看蒙了给我&#xff0c;这里记录一个整洁的教程链接。以备后患。 下载安装全流程 UP还在记录生活&#xff0c;看的我好羡慕&#xff0c;呜呜。 [VirtualBox网络配置超全详解]&am…...

好用的Markdown阅读编辑器Typora破解记录

Typora破解 一、下载Typora二、安装Typora三、破解Typora &#x1f600; 记录一下Typora破解记录&#xff0c;怕不常用忘记咯&#xff0c;感觉自己现在的脑子就像我的肠子一样&#xff0c;刚装进去就么得了。。。&#x1f614; Typroa算是用起来很舒服的Markdown阅读器了吧&am…...

系统与网络安全------Windows系统安全(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 用户账号基础 本地用户账号基础 用户账号概述 用户账号用来记录用户的用户名和口令、隶属的组等信息 每个用户账号包含唯一的登录名和对应的密码 不同的用户身份拥有不同的权限 操作系统根据SID识别不同…...

使用 Docker Compose 在单节点部署多容器

Docker Compose 是什么 Docker Compose 是一个用于运行多容器应用的工具, 通过一个docker-compose.yml文件, 配置应用的服务、网络和卷&#xff0c;然后使用简单的命令启动或停止所有服务 为什么需要 Docker Compose 当你有一个包含多个相互依赖的容器应用时&#xff0c;手动…...

CSS中的em,rem,vm,vh详解

一&#xff1a;em 和 rem 是两种相对单位&#xff0c;它们常用于 CSS 中来设置尺寸、字体大小、间距等&#xff0c;主要用于更灵活和响应式的布局设计。它们与像素&#xff08;px&#xff09;不同&#xff0c;不是固定的&#xff0c;而是相对于其他元素的尺寸来计算的。 1. em …...

MQTT之重复消息(5、TCP重连和MQTT重连)

目录 1. TCP 协议层的重传&#xff08;原生机制&#xff09; 2. 触发 TCP 重传的具体场景 3、TCP 重传的关键参数&#xff08;了解&#xff09; 第一、重传超时(RTO - Retransmission Timeout) 第二、重传次数 第三、累计时间 vs 本次 RTO 的区别 第四.常见问题解答 第…...

Ground Truth(真实标注数据):机器学习中的“真相”基准

Ground Truth&#xff1a;机器学习中的“真相”基准 文章目录 Ground Truth&#xff1a;机器学习中的“真相”基准引言什么是Ground Truth&#xff1f;Ground Truth的重要性1. 模型训练的基础2. 模型评估的标准3. 模型改进的指导 获取Ground Truth的方法1. 人工标注2. 众包标注…...

Android学习总结之通信篇

一、Binder跨进程通信的底层实现细节&#xff08;挂科率35%&#xff09; 高频问题&#xff1a;“Binder如何实现一次跨进程方法调用&#xff1f;”   候选人常见错误&#xff1a;   仅回答“通过Binder驱动传输数据”&#xff0c;缺乏对内存映射和线程调度的描述混淆Binde…...

自动化发布工具CI/CD实践Jenkins部署与配置教程

1. 前言背景 其实一直想把jenkins 的笔记整理下&#xff0c;介于公司这次升级jenkins2.0 &#xff0c;根据自己部署的一些经验&#xff0c;我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目&#xff0c;随着项目的日益增多&#x…...

kubernet在prometheus+alertmanager+grafana框架下新增部署loki模块

整个框架拓扑图 #mermaid-svg-OK7jgNZ2I7II8nJx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-icon{fill:#552222;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-text{fill:#552222;stroke:#552…...

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知&#xff0c;Ubuntu默认使用Nouveau开源驱动&#xff0c;其性能受限&#xff0c;因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单&#xff0c;只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…...

Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?

引入 上一篇我们了解CountDownLatch的原理和常见用法&#xff0c;在CountDownLatch的源码注释中&#xff0c;有提到&#xff1a; 另一种典型用法是将一个问题分解为 N 个部分&#xff0c;用一个Runnable描述每个部分&#xff0c;该Runnable执行相应部分的任务并对闭锁进行倒计…...

【深度学习】不管理论,入门从手写数字识别开始

1. 环境安装 学习深度学习&#xff0c;开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用&#xff0c;建议使用这个组合。 编写手写数字识别测试代码&#xff0c;需要在使用Anaconda安装以下4个库&#xff1a; NumpyScipymatplotlibsci…...

Docker使用ubuntu

1. 更换源 sudo nano /etc/docker/daemon.json //daemon.conf查找最新可用的源1、2&#xff0c;手动查找会不断更新&#xff01; 1.1 添加DNS sudo nano /etc/resolv.confnameserver 8.8.8.8 nameserver 8.8.4.4 2. 修改配置文件后重新加载 sudo systemctl daemon-relo…...

Windows 系统下多功能免费 PDF 编辑工具详解

IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具&#xff0c;它完美适配Windows操作系统。其用户界面设计得十分直观&#xff0c;哪怕是初次接触的用户也能快速上手。更为重要的是&#xff0c;该软件具备丰富多样的强大功能&#xff0c;能全方位满足各类PDF编辑…...

影响HTTP网络请求的因素

影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞&#xff1a;浏览器会因为一些原因阻塞请求&#xff0c;浏览器对于同一个域名&#xff0c;同时只能有4个连接&#xff08;这个根据浏览器内核不同可能会有所差异&#xff09;&#xff0c;超过浏览器最大连接数限制&…...

OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)

🔔 OpenGL 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并…...

Java + LangChain 实战入门,开发大语言模型应用!

在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章&#xff0c;写的非常不错&#xff0c;非常适合初学者。于是&#xff0c;我抽空翻译了一下。 原文地址&#xff1a;https://www.baeldung.com/java-langchain-basics翻译&#xff1a; Java…...

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...

软考《信息系统运行管理员》- 6.2 信息系统硬件的安全运维

硬件安全运行的概念 硬件安全运行的含义是保护支撑信息系统业务活动的信息系统硬件资产免遭自然灾害、人 为因素及各种计算机犯罪行为导致的破坏。硬件安全通常包括环境安全、设备安全和介质安全。 硬件安全运行的影响因素 硬件安全运行的影响因素主要有&#xff1a; (1)自然…...

SQL 视图

SQL 视图 引言 SQL&#xff08;结构化查询语言&#xff09;视图是数据库管理系统中的一种重要概念。它提供了一个虚拟的表&#xff0c;该表由一个或多个基本表的数据组成&#xff0c;用户可以通过视图查询数据&#xff0c;而不需要直接操作基本表。本文将详细介绍SQL视图的定…...

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS&#xff1f; 在前后端开发过程中&#xff0c;我们经常会遇到 跨域请求被浏览器拦截 的问题。例如&#xff0c;你在 http://localhost:3000 调用 https://api.example.com 时&#xff0c;可能会…...

数值稳定性 + 模型初始化和激活函数

数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft​(ht−1)andyℓ∘fd​∘…∘…...

【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka

1. 消息队列 几个组件&#xff1a; Redis Stream&#xff1a;适用于对性能要求高、可靠性要求不高的场景Rocket MQ&#xff1a;可靠性高&#xff0c;性能优秀&#xff0c;但官方对 go 不太友好&#xff0c;sdk 缺少很多功能支持Rabbit MQ&#xff1a;性能适中&#xff0c;使用…...

TCP协议与wireshark抓包分析

一、tcp协议格式 1. 源端口号 &#xff1a; 发送方使用的端口号 2. 目的端口号 &#xff1a; 接收方使用的端口号 3. 序号: 数据包编号 &#xff0c; tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包&#xff0c…...

深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述

目录 &#x1f4c2; 深度学习四大核心架构 &#x1f330; 知识点概述 &#x1f9e0; 核心区别对比表 ⚡ 生活化案例理解 &#x1f511; 选型指南 &#x1f4c2; 深度学习四大核心架构 第一篇&#xff1a; 神经网络基础&#xff08;NN&#xff09; &#x1f330; 知识点概述…...

springcloud 整合 Redis_Redisson

springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...

Windows模仿Mac大小写切换, 中英文切换

CapsLock 功能优化脚本部署指南 部署步骤 第一步&#xff1a;安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步&#xff1a;部署脚本 直接运行 (调试推荐) 新建文本文件&#xff0c;粘贴…...

基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...

网络原理-TCP/IP

网络原理学习笔记&#xff1a;TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记&#xff0c;主要涵盖传输层、网络层和数据链路层的核心协议和概念&#xff0c;特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端&#xff08;进程到进…...

【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…...

AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述&#xff1a; AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务&#xff0c;本地硬件配置不高的情况&#xff0c;建议使用云服务商的ASR 解决方案&#xff1a; 1.登…...

Dify 0.15.3版本 本地部署指南

目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...