项目模块十七:HttpServer模块

一、项目模块设计思路

目的:实现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.mzph.cn/diannao/60452.shtml

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

相关文章

内网域环境、工作组、局域网等探针方案

1. 信息收集 1.1 网络收集 了解当前服务器的计算机基本信息&#xff0c;为后续判断服务器角色&#xff0c;网络环境做准备 systeminfo 详细信息 net start 启动服务 tasklist 进程列表 schtasks 计划任务&#xff08;受权限影响&#xff09; 了解当前服务器的网络接口信息…

什么是量化交易

课程大纲 内容初级初识量化&#xff0c;理解量化 初识量化 传统量化和AI量化的区别 量化思想挖掘 量化思想的挖掘及积累技巧 量化代码基础&#xff1a; python、pandas、SQL基础语法 金融数据分析 常用金融分析方式 常用因子分析方式 数据分析实战练习 回测及交易引擎 交易引擎…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示&#xff1a;   OpenHarmony(简称OH)的标准系统的底层系统是linux&#xff0c;所以调用如下代码&#xff1a; linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

简单理解回调函数

回调函数是编程中一个非常重要的概念&#xff0c;它是一种以函数作为参数并在某个事件或条件满足时被调用的函数。这种机制使得程序能够以非线性的方式执行&#xff0c;增加了代码的灵活性和模块化。下面我将详细解释回调函数的几个关键点&#xff1a; 定义和作用 回调函数是一…

C++:线程(thread)的创建、调用及销毁

在 C 中&#xff0c;线程的管理主要依赖于标准库 std::thread&#xff0c;自 C11 起&#xff0c;这一功能被标准化&#xff0c;使得我们能够更加方便地创建、管理和销毁线程。这里我们详细讲解线程的创建、调用和销毁流程。 1. 线程的创建 创建线程通常是为了在单独的线程中执…

【LeetCode】【算法】64. 最小路径和

LeetCode 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路 思路&#xff1a;这种题太典了&#xff0c;典…

什么时候需要复写hashcode()和compartTo方法

在Java编程中&#xff0c;复写&#xff08;重写&#xff09;hashCode()和compareTo()方法的需求通常与对象的比较逻辑和哈希集合的使用紧密相关。但请注意&#xff0c;您提到的compartTo可能是一个拼写错误&#xff0c;正确的方法名是compareTo()。以下是关于何时需要复写这两个…

1.7 JS性能优化

从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 追问&#xff1a;http 与 TCP 1. http - 应用层 < > TCP - 传输层 2. 关联 - http基于TCP实现连接 < > UDP > 握手 & 挥手 &#xff08;传输速率上较…

批量修改文本的神器“多光标”(Multi-cursor)

“多光标”是许多文本编辑器和IDE&#xff08;如Visual Studio Code、Sublime Text或PyCharm&#xff09;中的一个功能&#xff0c;允许你在文本的不同位置放置多个光标并同时编辑它们。这在处理重复性任务时非常有用&#xff0c;比如重命名变量、同时编辑多行文本或在多个位置…

Spring Task详细讲解

✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具&#xff0c;也就意味着不需要再添加第三方依赖了&#xff0c;相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒…

FreeRTOS源码(二) 任务调度

FreeRTOS源码(二) 任务调度 任务创建 1、任务结构体 typedef struct tskTaskControlBlock {volatile StackType_t *pxTopOfStack; /* Points to the location of the last item placed on the tasks stack. */ListItem_t xStateListItem; /* The list that holds…

Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用&#xff0c;本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理&#xff0c;帮助开发者快速理解如何通过代码控制相机&#xff0c;实时采集并处理图像数据。*** 1. 搜索并…

ubuntu ros 解决建完图后 保存的地图非常小的问题

解决建完图后 保存的地图非常小的问题 在ROS中使用Gmapping等SLAM算法建图后&#xff0c;如果保存的地图非常小&#xff0c;通常是由于建图过程中的分辨率设置不当或地图边界没有覆盖到整个环境导致的。以下是详细的解决方案和具体步骤&#xff1a; 解决方案概述 调整地图分…

HDLBIts习题(5):移位寄存器

&#xff08;1&#xff09;易错习题1&#xff1a;109题&#xff08;shift18&#xff09; 对算数左移和算数右移概念不清&#xff0c;不知道该如何计算。 逻辑左移和算术左移之间没有区别。&#xff08;无论是有符号位数据还是无符号位数据&#xff0c;右侧补0&#xff09; 逻辑…

想要成为独立游戏作者 :通关!游戏设计之道 2-2 关卡设计

本文通过ai辅助总结加个人微调,不喜勿喷 前篇如下&#xff1a; 想要成为独立游戏作者 &#xff1a;通关&#xff01;游戏设计之道 2-1 HUD-CSDN博客 1.关卡的多重定义 在电子游戏行业里 “关卡” 有多种含义&#xff0c;如游戏行为发生的环境、分割的游戏体验单元、量…

【深圳大学】数据结构A+攻略(计软版)

1. 考试 1.1 形式 分为平时&#xff0c;笔试&#xff0c;机试三部分。其中&#xff1a; 平时占30%&#xff0c;包含平时OJ测验和课堂练习&#xff0c;注意这个可能会因老师的不同和课题组的新策略而改变。笔试占60%&#xff0c;是分值占比的主要部分。机试占10%。 1.2 题型…

Springboot 启动端口占用如何解决

Springboot 启动端口占用如何解决 1、报错信息如下 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 9010 was already in use.Action:Identify and stop the process thats listening o…

名词解释-2-形状算数实验、潜在空间、3D生成模型

形状算术实验&#xff08;Shape Arithmetic&#xff09;是一种在3D生成模型中进行的实验&#xff0c;旨在通过在潜在空间中对形状的潜在向量进行算术操作来实现形状的变换。具体来说&#xff0c;该实验通过选择两个不同的3D形状实例&#xff0c;将其输入到编码器中生成两个潜在…

C++继承和参数化类型(模板)各自的优点

在C中&#xff0c;继承和参数化类型&#xff08;模板&#xff09;都是强大的代码重用机制&#xff0c;它们各自具有独特的优点。以下是对这两种机制优点的比较和归纳&#xff1a; C继承的优点 代码重用&#xff1a;继承允许子类继承父类的属性和方法&#xff0c;从而避免了重…

H.264/H.265播放器EasyPlayer.js RTSP播放器关于webcodecs硬解码H265的问题

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方式&#xff0c…