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

C++高性能服务器框架----Servlet模块

Servlet模块HTTP Servlet包括两部分第一部分是Servlet对象每个Servlet对象表示一种处理HTTP消息的方法第二部分是ServletDispatch它包含一个请求路径到Servlet对象的映射用于指定一个请求路径该用哪个Servlet来处理。1. 主要功能提供HTTP请求路径到处理类的映射用于规范化的HTTP消息处理流程。2. 功能演示一个简单的服务器由ServletDispatch完成uri对应的逻辑处理代码语言javascriptAI代码解释johnsonli::http::HttpServer::ptr server(new johnsonli::http::HttpServer(true)); johnsonli::Address::ptr addr johnsonli::Address::LookupAnyIPAddress(0.0.0.0:8020); while(!server-bind(addr)) { sleep(2); } // /sylar/xx映射 auto dsp server-getServletDispatch(); dsp-addServlet(/sylar/xx, [](johnsonli::http::HttpRequest::ptr req , johnsonli::http::HttpResponse::ptr rsp , johnsonli::http::HttpSession::ptr session){ rsp-setBody(req-toString()); return 0; }); // /sylar/*映射 dsp-addGlobServlet(/sylar/*, [](johnsonli::http::HttpRequest::ptr req , johnsonli::http::HttpResponse::ptr rsp , johnsonli::http::HttpSession::ptr session){ rsp-setBody(Glob:\r\n req-toString()); return 0; }); server-start();3. 模块介绍3.1 Servlet基类用于封装处理请求的方法代码语言javascriptAI代码解释class Servlet { public: typedef std::shared_ptrServlet ptr; Servlet(const std::string name) :m_name(name) {} virtual ~Servlet() {} /** * brief 处理请求 * param[in] request HTTP请求 * param[in] response HTTP响应 * param[in] session HTTP连接 * return 是否处理成功 */ virtual int32_t handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) 0; const std::string getName() const { return m_name;} protected: std::string m_name; // servlet名称 };3.2 FunctionServlet继承Servlet封装了一个回调函数m_cb用于具体的逻辑处理代码语言javascriptAI代码解释class FunctionServlet : public Servlet { public: /// 智能指针类型定义 typedef std::shared_ptrFunctionServlet ptr; /// 函数回调类型定义 typedef std::functionint32_t (johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) callback; /** * brief 构造函数 * param[in] cb 回调函数 */ FunctionServlet(callback cb); virtual int32_t handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) override; private: /// 回调函数 callback m_cb; };handle方法处理逻辑实际上是调用的m_cb回调函数代码语言javascriptAI代码解释int32_t FunctionServlet::handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) { //调用回调 return m_cb(request, response, session); }3.3 NotFoundServlet对于没有uri映射的Servlet统一使用这个进行默认处理返回一个404页面代码语言javascriptAI代码解释/** * brief NotFoundServlet(默认返回404) */ class NotFoundServlet : public Servlet { public: typedef std::shared_ptrNotFoundServlet ptr; NotFoundServlet(const std::string name); virtual int32_t handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) override; private: std::string m_name; std::string m_content; }; int32_t NotFoundServlet::handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) { response-setStatus(johnsonli::http::HttpStatus::NOT_FOUND); response-setHeader(Server, sylar/1.0.0); response-setHeader(Content-Type, text/html); response-setBody(m_content); return 0; }3.4 ServletDispatch继承Servlet用于管理所有uri到Servle的映射unordered_mapstd::string, Servlet::ptr代码语言javascriptAI代码解释class ServletDispatch : public Servlet { public: typedef std::shared_ptrServletDispatch ptr; typedef RWMutex RWMutexType; ServletDispatch(); virtual int32_t handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) override; // addServlet, delServlet, addGlobServlet, delGlobServlet, ... private: /// 读写互斥量 RWMutexType m_mutex; /// 精准匹配servlet MAP /// uri(/sylar/xxx) - servlet std::unordered_mapstd::string, Servlet::ptr m_datas; /// 模糊匹配servlet 数组 /// uri(/sylar/*) - servlet std::vectorstd::pairstd::string, Servlet::ptr m_globs; /// 默认servlet所有路径都没匹配到时使用 Servlet::ptr m_default; };handle方法通过request的uri找到对应的Servlet然后执行其对应的业务逻辑处理方法handle代码语言javascriptAI代码解释int32_t ServletDispatch::handle(johnsonli::http::HttpRequest::ptr request , johnsonli::http::HttpResponse::ptr response , johnsonli::http::HttpSession::ptr session) { auto slt getMatchedServlet(request-getPath()); if(slt) { slt-handle(request, response, session); } return 0; }如何完成映射这里有三种映射的方式一个是精确匹配一个是模糊匹配如果都没有匹配到还有一个默认的servlet处理NotFoundServlet。代码语言javascriptAI代码解释/// 精准匹配servlet MAP /// uri(/sylar/xxx) - servlet std::unordered_mapstd::string, Servlet::ptr m_datas; /// 模糊匹配servlet 数组 /// uri(/sylar/*) - servlet std::vectorstd::pairstd::string, Servlet::ptr m_globs; /// 默认servlet所有路径都没匹配到时使用 Servlet::ptr m_default;精确匹配优先级大于模糊匹配代码语言javascriptAI代码解释Servlet::ptr ServletDispatch::getMatchedServlet(const std::string uri) { RWMutexType::ReadLock lock(m_mutex); //先找m_datas优先级更高 auto mit m_datas.find(uri); if(mit ! m_datas.end()) { return mit-second; } //再找m_globs for(auto it m_globs.begin(); it ! m_globs.end(); it) { if(!fnmatch(it-first.c_str(), uri.c_str(), 0)) { return it-second; } } return m_default; }3.5 HttpServer中使用Servlet当服务器收到一个请求时将请求给ServletDispatch由ServletDispatch负责uri的不同处理。代码语言javascriptAI代码解释class HttpServer : public TcpServer { public: // ... ServletDispatch::ptr getServletDispatch() const { return m_dispatch;} void setServletDispatch(ServletDispatch::ptr v) { m_dispatch v;} private: // ... ServletDispatch::ptr m_dispatch; // Servlet分发器 };handleClient中的一些改变由ServletDispatch负责uri对应的业务逻辑处理代码语言javascriptAI代码解释void HttpServer::handleClient(Socket::ptr client) { HttpSession::ptr session(new HttpSession(client)); do{ auto req session-recvRequest(); if(!req) { LOG_DEBUG(g_logger) recv http request fail, errno errno errstr strerror(errno) cliet: *client keep_alive m_isKeepalive; break; } HttpResponse::ptr rsp(new HttpResponse(req-getVersion() ,req-isClose() || !m_isKeepalive)); //servlet dispatch负责处理对应的请求 m_dispatch-handle(req, rsp, session); session-sendResponse(rsp); }while(m_isKeepalive); }

相关文章:

C++高性能服务器框架----Servlet模块

Servlet模块HTTP Servlet包括两部分,第一部分是Servlet对象,每个Servlet对象表示一种处理HTTP消息的方法,第二部分是ServletDispatch,它包含一个请求路径到Servlet对象的映射,用于指定一个请求路径该用哪个Servlet来处…...

【审计专栏-监督监管】【信息科学与工程学】计算机科学与自动化——第一百五十篇 招投标领域中的应用数学02

编号 033 维度 内容 编号​ 033 领域​ 招投标数学分析 类型​ 餐饮工程“食材价格虚高”与“供应链绑定”式合谋识别 招投标领域​ 团餐服务、食材集中采购、厨房设备采购 子领域​ 学校食堂承包、机关单位食堂外包、大型活动供餐、中央厨房建设 招投标的行业​ …...

5分钟掌握Mermaid CLI:用代码生成专业图表的高效方法

5分钟掌握Mermaid CLI:用代码生成专业图表的高效方法 【免费下载链接】mermaid-cli Command line tool for the Mermaid library 项目地址: https://gitcode.com/gh_mirrors/me/mermaid-cli 在技术文档和架构设计中,图表是不可或缺的沟通工具。Me…...

DeepSeek MMLU成绩暴涨11.2分的秘密武器:不是更大参数,而是这个被顶会论文雪藏2年的校准框架(附开源复现代码)

更多请点击: https://intelliparadigm.com 第一章:DeepSeek MMLU成绩暴涨11.2分的实证现象 近期,DeepSeek-R1 在大规模多任务语言理解(MMLU)基准测试中取得显著突破——其零样本准确率从 72.3% 提升至 83.5%&#xff…...

保姆级教程:手把手教你为NPM账号开启2FA双重认证(附Microsoft Authenticator配置)

从零到精通:NPM账号2FA双重认证实战指南 最近NPM包被劫持的事件频发,让不少开发者开始重新审视账号安全的重要性。作为JavaScript生态的核心基础设施,NPM账号一旦被盗,不仅可能导致私有包泄露,更可能危及依赖这些包的所…...

如何3步快速掌握DataCleaner:开源数据质量工具完全指南

如何3步快速掌握DataCleaner:开源数据质量工具完全指南 【免费下载链接】DataCleaner The premier open source Data Quality solution 项目地址: https://gitcode.com/gh_mirrors/dat/DataCleaner 你是否曾为数据中的错误和缺失而烦恼?DataClean…...

Spek音频频谱分析器:从声音可视化到音频质量检测的完整指南

Spek音频频谱分析器:从声音可视化到音频质量检测的完整指南 【免费下载链接】spek Acoustic spectrum analyser 项目地址: https://gitcode.com/gh_mirrors/sp/spek 当你打开一个音频文件,听到杂音或失真时,是否想过如何精确诊断问题所…...

基于树莓派与AstroPrint搭建无线3D打印控制中心实战指南

1. 项目概述:为什么需要无线3D打印控制?如果你和我一样,是个喜欢折腾3D打印机的创客或爱好者,那你肯定经历过这样的场景:为了打印一个模型,需要先在电脑上用切片软件生成G-code文件,然后找到读卡…...

49_《智能体微服务架构企业级实战教程》智能助手主应用服务之工具执行节点

前言 配套视频教程: 在 Bilibili课堂、CSDN课程、51CTO学堂 同步发售,提供:源码+部署脚本+文档。 bilibili课堂视频教程:智能体微服务架构企业级实战教程_哔哩哔哩_bilibili CSDN课程视频教程:智能体微服务架构企业级实战教程_在线视频教程-CSDN程序员研修院 51CTO学堂…...

医疗影像分割新范式:MedSAM让医学AI触手可及

医疗影像分割新范式:MedSAM让医学AI触手可及 【免费下载链接】MedSAM Segment Anything in Medical Images 项目地址: https://gitcode.com/gh_mirrors/me/MedSAM 在医疗影像分析领域,精确的器官和病变分割一直是临床诊断和手术规划的核心挑战。传…...

免费开源的终极分子绘图神器:5分钟快速上手Ketcher完整指南

免费开源的终极分子绘图神器:5分钟快速上手Ketcher完整指南 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher 你是否厌倦了笨重的化学绘图软件?想找一款既专业又轻量的分子结构编辑器…...

如何5分钟快速提升GitHub访问速度:FastGithub完整配置指南

如何5分钟快速提升GitHub访问速度:FastGithub完整配置指南 【免费下载链接】FastGithub github定制版的dns服务,解析访问github最快的ip 项目地址: https://gitcode.com/gh_mirrors/fa/FastGithub GitHub作为全球开发者最常用的代码托管平台&…...

思源宋体:中文排版设计中的成本效益革命

思源宋体:中文排版设计中的成本效益革命 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否曾为商业项目中的中文字体授权费用而头疼?或者为寻找既专业又免费…...

GAIA-DataSet:构建智能运维研究的数据基石与算法验证平台

GAIA-DataSet:构建智能运维研究的数据基石与算法验证平台 【免费下载链接】GAIA-DataSet GAIA, with the full name Generic AIOps Atlas, is an overall dataset for analyzing operation problems such as anomaly detection, log analysis, fault localization, …...

DeepSeek Chat功能测试实战手册:5步完成生产级对话模型验收(附测试用例模板)

更多请点击: https://intelliparadigm.com 第一章:DeepSeek Chat功能测试实战手册:5步完成生产级对话模型验收(附测试用例模板) DeepSeek Chat 作为开源大语言模型对话接口,其生产就绪性需通过结构化、可…...

MATLAB 2024 升级指南:彻底卸载旧版,高效部署新版

1. 为什么需要彻底卸载旧版MATLAB? 每次MATLAB大版本更新都会带来新功能和性能优化,但很多用户直接覆盖安装后常遇到各种奇怪问题。我去年帮实验室处理过几十台电脑的升级故障,90%的问题都源于旧版残留文件。比如有位同学复现图像处理代码时&…...

Resemble Enhance:AI语音增强的终极指南,让嘈杂录音秒变专业音频

Resemble Enhance:AI语音增强的终极指南,让嘈杂录音秒变专业音频 【免费下载链接】resemble-enhance AI powered speech denoising and enhancement 项目地址: https://gitcode.com/gh_mirrors/re/resemble-enhance 你是否曾因录音环境嘈杂而烦恼…...

千川素材月烧3万外包费?用易元AI自建素材工厂,省70%成本跑量更猛

做千川投放的商家都深有体会:限制账户放量的从来不是预算,而是素材成本高、产能慢、优质有效素材稀缺。当下千川商家都陷入同一个困境:不做素材没法投放,大批量做素材又烧钱。一款产品要多卖点测试,投放计划需要持续补…...

基于Next.js全栈技术构建本地即时交易平台:架构设计与核心实现

1. 项目概述:一个面向本地市场的即时交易平台最近在逛GitHub的时候,发现了一个挺有意思的项目,叫marketmenow。光看这个名字,你大概就能猜到它的方向——一个“现在就能交易的市场”。没错,这是一个旨在构建本地化、即…...

5大理由:为什么UAV Log Viewer是你的无人机飞行数据分析终极工具

5大理由:为什么UAV Log Viewer是你的无人机飞行数据分析终极工具 【免费下载链接】UAVLogViewer An online viewer for UAV log files 项目地址: https://gitcode.com/gh_mirrors/ua/UAVLogViewer UAV Log Viewer是一款基于JavaScript开发的免费开源无人机飞…...

从SM16306+74HC595D驱动电梯点阵屏,看恒流驱动芯片的选型与实战避坑

1. 为什么选择SM1630674HC595D这对组合 第一次接触电梯点阵屏驱动项目时,我也纠结过芯片选型问题。市面上常见的方案要么成本太高,要么电路太复杂。直到发现SM16306和74HC595D这对黄金搭档,才真正体会到什么叫"低成本高性能"。 先…...

如何用memtest_vulkan快速检测GPU显存稳定性:终极免费测试指南

如何用memtest_vulkan快速检测GPU显存稳定性:终极免费测试指南 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 当你的游戏突然崩溃、AI训练意外中断…...

Android端ChatGPT应用开发:MVVM架构、流式响应与性能优化实践

1. 项目概述:一个能“随身携带”的ChatGPT最近在折腾Android开发,特别是想把手头的一些AI能力集成到移动端应用里。我发现了一个挺有意思的开源项目,叫“AnywhereGPT-Android”。光看名字就挺吸引人——“Anywhere GPT”,顾名思义…...

深度解析微信小程序逆向工程:wxappUnpacker技术揭秘与实战指南

深度解析微信小程序逆向工程:wxappUnpacker技术揭秘与实战指南 【免费下载链接】wxappUnpacker forked from https://github.com/qwerty472123/wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 微信小程序作为现代移动应用开发…...

Lightweight Charts:金融图表库的模块化架构重构与性能突破

Lightweight Charts:金融图表库的模块化架构重构与性能突破 【免费下载链接】lightweight-charts Performant financial charts built with HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/li/lightweight-charts 在金融数据可视化领域,…...

明日方舟游戏资源库:一站式高清素材解决方案

明日方舟游戏资源库:一站式高清素材解决方案 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 还在为创作明日方舟同人内容却找不到高质量素材而烦恼吗?想要开发明…...

录音转文字在线版有哪些?这几款免费录音转文字在线工具怎么选?

很多人做录音转文字的时候默认用专业级的转录服务,其实像提词匠这样的轻量工具已经够用了。特别是如果你只是偶尔需要把会议录音、课堂笔记、视频素材转成文字,不必非要上手深度学习复杂的专业软件。下面我梳理了目前市面上主流的录音转文字在线版工具,既有微信小程序也有网页版…...

从硬开关到软开关:推挽谐振变换器原理与PSIM仿真实战

1. 从经典到谐振:为什么我们需要推挽变换器?在电源设计的工具箱里,推挽变换器(Push-Pull Converter)绝对算得上是一位“老将”。它的核心思想非常直观:利用一个带中心抽头的变压器,让两个开关管…...

从零搭建CFD-DEM耦合环境:OpenFOAM与PFC3D在WSL2下的实战部署指南

1. 环境准备:WSL2与Ubuntu基础配置 第一次接触CFD-DEM耦合仿真的同学,建议从Windows系统起步。微软的WSL2(Windows Subsystem for Linux)现在已经能完美支持Ubuntu环境,实测比虚拟机流畅得多。我去年在联想小新Pro16上…...

STM32CubeMX配置SPI驱动W25Q64 Flash:从硬件连接到驱动封装,一个完整项目实战

STM32CubeMX实战:构建高可靠SPI Flash存储系统从硬件到软件全解析 在嵌入式开发中,外部Flash存储解决方案往往成为扩展设备数据容量的关键选择。W25Q64作为一款经典的64M-bit SPI Flash芯片,凭借其稳定的性能和广泛的应用场景,成为…...