项目模块十七:HttpServer模块

news2024/12/24 16:21:16

一、项目模块设计思路

目的:实现HTTP服务器搭建

思想:设计请求路由表,记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表,服务器只接受请求并调用用户的处理函数即可。

处理流程:

二、成员变量

定义请求处理函数,作用是给我请求对象,我处理后返回应答对象

using Handler = function<void(const HttpRequest &, HttpResponse *)>;

using Handlers = vector<std::pair<regex, Handler>>; // 匹配的是资源路径的正则表达式来对应处理函数

定义四个请求方法对应的请求处理函数的路由表

Handlers _get_route;

Handlers _post_route;

Handlers _put_route;

Handlers _delete_route;

定义高并发服务器:TcpServer _server;

静态资源的相对根目录:string _basedir;

三、成员函数

1、私有函数1:错误信息填充 void ErrorHandler(const HttpRequest &req, HttpResponse *rsp)

填充应答正文的 html 错误网络页面,并设置正文类型是 html

2、私有函数2:组织应答报文并发送 void WriteResponse(const PtrConnection &conn, const HttpRequest &req, const HttpResponse &rsp)

(1)完善应答报头:Connection, Context-Length, Context-Type, Location

(2)组织应答报文:应答行 + 应答报头 + 空行 + 应答正文

(3)发送

3、私有函数3:判断是否是静态资源请求 bool IsFileHandler(const HttpRequest &req)

(1)是否设置了静态资源根目录

(2)请求方法是否是 GET 或 HEAD

(3)资源路径是否合法

(4)要求资源路径必须存在并且是普通文件(如果请求目录后面加上 index.html 再判断是不是普通文件)

4、私有函数4:静态资源请求处理 void FIleHandler(const HttpRequest &req, HttpResponse *rsp)

(1)先把请求中的相对资源路径加上静态资源根目录,如果请求目录后面加上 index.html

(2)将绝对路径中的文件读入 rsp 的正文中

(3)设置正文的类型

5、私有函数5:功能性请求处理 void Dispatcher(const HttpRequest &req, HttpResponse *rsp, Handler &handlers)

循环遍历路由表里面的正则资源路径,如果匹配就执行对应的处理函数,找不到应答状态码404

6、私有函数6:总处理请求 void Route(HttpRequest &req, HttpResponse *rsp)

(1)如果是静态资源请求就调静态处理函数

(2)如果请求方法是 GET / HEAD 就用 _get_route

         如果请求方法是 PUT 就用 _put_route

         如果请求方法是 POST 就用 _post_route

         如果请求方法是 DELETE 就用 _delete_route

(3)全都不是就应答状态码405

7、私有函数7:设置给 TcpServer 的连接建立回调函数 void OnConnected(const PtrConnection &conn)

连接建立立即设置一个空上下文

8、私有函数8:设置给 TcpServer 的处理缓冲区数据回调函数 void OnMessage(const PtrConnection &conn, Buffer *buf)

最重要,融合所有子模块的 HTTP 服务器处理流程

(1)循环处理缓冲区数据直到空

(2)获取连接中的上下文数据

(3)通过报文解析获得请求对象,并初始化应答对象

(4)若解析出错(应答状态码 >= 400)错误信息填充,组织应答发送,清空上下文和缓冲区,关闭连接

(5)报文没有接收完整,直接返回等待下一次接收

(6)业务处理,填写应答对象

(7)组织应答报文并发送

(8)清空上下文(应为是循环,所以一定要清空)

(9)短连接关闭

9、公有函数1:构造函数

传入端口号和超时连接销毁时间

(1)默认开启超时连接销毁

(2)绑定私有函数两个回调

10、公有函数2:设置静态资源相对根目录 void SetBasedir(const string &basedir)

赋值私有成员

11、公有函数3:外部添加4种路由表的正则资源路径和对应的处理函数

赋值私有成员

12、公有函数4:设置线程池数量 void SetThreadCount(int count)

赋值私有成员

13、公有函数5:开始服务器 void Listen()

TcpServer 启动

四、代码展示

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

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

相关文章

Android音视频直播低延迟探究之:WLAN低延迟模式

Android WLAN低延迟模式 Android WLAN低延迟模式是 Android 10 引入的一种功能&#xff0c;允许对延迟敏感的应用将 Wi-Fi 配置为低延迟模式&#xff0c;以减少网络延迟&#xff0c;启动条件如下&#xff1a; Wi-Fi 已启用且设备可以访问互联网。应用已创建并获得 Wi-Fi 锁&a…

requests库如何处理 - POST请求常见的两种请求体格式:表单格式JSON格式

目录&#xff1a; 每篇前言&#xff1a;一、POST请求的两种常见请求体格式详解1. 表单格式&#xff08;form-encoded&#xff09; - 举例&#xff1a;福州搜索示例代码&#xff08;表单数据&#xff09;&#xff1a; 2. JSON格式 - 举例&#xff1a;CSDN搜索示例代码&#xff0…

HCIP-HarmonyOS Application Developer 习题(二十二)

1、用户将手机导航迁移至智能手表之后&#xff0c;智能手表如果需要获取手机传过来的数据&#xff0c;从下列哪个方法中获取? A、onCompleteContinuation() B、onStartContinuation() C、onRestoreData() D、onSaveData() 答案&#xff1a;C 分析&#xff1a;FA发起迁移后&am…

LLMs之Code:Github Spark的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code&#xff1a;Github Spark的简介、安装和使用方法、案例应用之详细攻略 目录 Github Spark的简介 Github Spark的安装和使用方法 1、安装 2、使用方法 Github Spark的案例应用 Github Spark的简介 2024年10月30日&#xff0c;GitHub 重磅发布GitHub Spark 是一…

会议直击|美格智能受邀出席第三届无锡智能网联汽车生态大会,共筑汽车产业新质生产力

11月10日&#xff0c;2024世界物联网博览会分论坛——第三届无锡智能网联汽车生态大会在无锡举行&#xff0c;美格智能CEO杜国彬受邀出席&#xff0c;并参与“中央域控&#xff1a;重塑汽车智能架构的未来”主题圆桌论坛讨论&#xff0c;与行业伙伴共同探讨智能网联汽车产业领域…

HMSC联合物种分布模型在群落生态学中的贝叶斯统计分析

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

【AI技术对电商的影响】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python酷库之旅-第三方库Pandas(211)

目录 一、用法精讲 986、pandas.MultiIndex.get_loc方法 986-1、语法 986-2、参数 986-3、功能 986-4、返回值 986-5、说明 986-6、用法 986-6-1、数据准备 986-6-2、代码示例 986-6-3、结果输出 987、pandas.MultiIndex.get_locs方法 987-1、语法 987-2、参数 …

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…

Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

性能测试|JMeter接口与性能测试项目

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

2025年使用 AI 识别解决 reCAPTCHA

人工智能无处不在。它是推动许多技术进步的动力&#xff0c;不断改变我们与网络的互动方式。从聊天机器人到个性化推荐&#xff0c;人工智能不再是遥远的未来概念&#xff0c;而是深深融入我们的日常生活。那么&#xff0c;当人工智能遇到 reCAPTCHA&#xff0c;一种最常见的在…

Axure PR 9 多级下拉选择器 设计交互

​ 大家好&#xff0c;我是大明同学。 Axure选择器是一种在交互设计中常用的组件&#xff0c;这期内容&#xff0c;我们来探讨Axure中多级下拉选择器设计与交互技巧。 下拉列表选择输入框元件 创建选择输入框所需的元件 1.在元件库中拖出一个矩形元件。 2.选中矩形元件&…

基础网络安全知识

1.ctfhub技能树 1.1 Web-SQL注入 Web-SQL注入-整数型 && 字符型 && MySQL结构 参考&#xff1a;5.9.6MySql注入 Web-SQL注入-报错注入 step1: 查库名 ?id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- step2: 查看表名 ?id1 and extractvalue(1…

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了(每月逐步提高复现的效果)&#xff0c;故准备把dexcap的源码也分析下&#xff0c;11月​下旬则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯…

【软件工程】ATAM架构权衡评估方法

ATAM架构权衡评估方法 概述质量属性有哪些&#xff1f;质量属性的效用树怎么构建&#xff1f;如何确定质量属性的优先级&#xff1f; 概述 ATAM&#xff08;Architecture Tradeoff Analysis Method&#xff09;是一种系统架构评估方法&#xff0c;由卡梅隆大学软件工程协会提出…

BPMNJS设计器开发核心功能分析

系统功能 在开发一个前端工作流设计器&#xff0c;尤其是基于BPMN&#xff08;业务流程建模与标注&#xff09;或类似于钉钉的设计器时&#xff0c;主要需求可以总结为以下几个关键点&#xff1a; 1. 流程节点与边的设计 节点类型多样化&#xff1a;支持基础节点&#xff08…

快递100 物流查询API全面解析

一.基础准备 1.物流查询痛点 如何通过物流单号实时查询物流信息?如何实时查看物流地图轨迹? 使用快递 100&#xff0c;用户可以通过简单地输入快递单号来获取快递的详细物流状态&#xff0c;不仅能看到包裹目前的位置信息&#xff0c;还可以了解它的运输进展。 快递 100API…

多角度审视推荐系统

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录 介绍 推荐工程师需要从不同的维度审视推荐系统&#xff0c;不仅抓住问题的核心&#xff0c;更要从整体上思考推荐问题。 具体包括以下内容&#xff1a; &#xff08;1&#xff09;推荐系统如何选取和处理特征…

网络自动化04:python实现ACL匹配信息(主机与主机信息)

目录 背景分析代码代码解读代码总体结构1. load_pattern_from_excel 函数2. match_and_append_pattern 函数3. main 函数总结 最终的效果&#xff1a; 今天不分享netmiko&#xff0c;今天分享一个用python提升工作效率的小案例&#xff1a;acl梳理时的信息匹配。 背景 最近同事…