基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)
已完成功能:
支持 GET 和 POST 请求的路由与回调处理。
解析URL请求。
单例模式 管理核心业务逻辑。
异步 I/O 技术和 定时器 控制超时。
通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。
1. 项目背景
1.1 项目简介
本项目是一个基于 Boost.Asio 和 Boost.Beast 的高性能 HTTP 服务器,实现了对 HTTP 请求的处理、路由功能和回调机制。该服务器使用 单例模式 来管理请求逻辑,并采用 异步 I/O 技术 来提升并发处理能力。支持的 HTTP 请求类型包括 GET 和 POST,并能够根据 URL 注册不同的处理函数,从而实现灵活的请求路由与回调处理机制。
1.2 项目目标
该项目旨在提供一个 高效、可扩展 的 HTTP 服务器,适用于处理大量并发 HTTP 请求,具备以下核心目标:
- 高并发处理能力:通过使用异步 I/O 和非阻塞 I/O 操作显著提升并发处理能力,避免因同步阻塞导致的性能瓶颈。
- 可扩展性:支持通过注册回调函数来灵活处理不同的 HTTP 请求,能够根据需要扩展支持更多的 HTTP 请求类型和自定义业务逻辑。
- 简洁的单例管理:使用单例模式管理全局资源,确保只有一个服务器实例和唯一的请求逻辑处理实例,避免重复初始化资源和管理多个实例的问题。
- 超时管理:通过 Boost.Asio 提供的定时器机制实现 HTTP 连接的超时控制,确保服务器能够及时关闭不活跃的连接,避免因连接泄漏导致的资源浪费。
2. 项目架构
2.1 架构概述
本项目采用了事件驱动的架构模型,基于 Boost.Asio 提供的异步 I/O 功能实现高效的请求处理。整个系统通过 CServer 启动并接受客户端的连接,HttpConnection 管理每个 HTTP 请求的连接,LogicSystem 处理请求的业务逻辑,利用 单例模式 确保请求处理逻辑的唯一性。各个模块协同工作,通过回调机制对请求进行处理。
服务器架构可以分为以下几个关键模块:
- CServer:负责启动服务器,监听指定端口并接受客户端连接请求。
- LogicSystem:使用单例模式管理 HTTP 请求的逻辑处理,负责路由注册与回调函数的执行。
- HttpConnection:处理每个 HTTP 请求的连接,包括请求解析、响应构建以及连接超时管理。
- Singleton:一个模板类,提供单例模式的实现,确保系统中逻辑处理系统和其他核心组件只有一个实例。
- 回调函数:通过回调函数类型 HttpHandler 处理 HTTP 请求,支持 GET 和 POST 请求的灵活处理。
2.2 模块划分
1.网络通信模块
该模块基于 Boost.Asio 库实现,用于管理异步的 TCP 连接和 HTTP 请求的处理。CServer 负责监听端口并接受客户端连接,HttpConnection 负责处理每个连接的 HTTP 请求,采用非阻塞 I/O 操作来保证服务器的高效性能。
关键类:
- CServer:负责创建 acceptor 并等待连接,管理 tcp::socket。
- HttpConnection:负责处理 HTTP 请求和响应,管理 TCP 连接。
2.HTTP 请求处理模块
该模块基于 Boost.Beast 实现,负责解析 HTTP 请求和构建 HTTP 响应。使用 http::request 和 http::response 类型来处理请求和响应内容。该模块还通过回调函数 HttpHandler 进行路由处理。
关键类:
- HttpConnection:解析请求并构建响应。
- LogicSystem:注册并调用处理 GET/POST 请求的回调函数。
3.单例模式模块
通过模板实现的 Singleton 类,确保了系统中 LogicSystem 类等重要组件的唯一性。它通过懒汉式单例模式来延迟初始化,避免了不必要的资源浪费,确保系统的高效运行。
关键类:
- Singleton:模板类,用于实现 LogicSystem 等核心组件的单例模式。
4.超时管理模块
Boost.Asio 的 steady_timer 被用于处理连接超时。每个 HTTP 连接都配备了一个定时器,如果连接在规定时间内没有收到有效响应,则会自动关闭连接,防止资源泄漏。
关键类:
- HttpConnection:内部持有一个 steady_timer,用于处理每个连接的超时。
2.3 数据流
项目的数据流过程如下:
- CServer 启动并监听指定端口,等待来自客户端的 TCP 连接。
- 客户端连接请求到来时,CServer 使用 acceptor 接受连接,并为每个连接创建一个 HttpConnection 实例。
- HttpConnection 启动异步读取操作,接收客户端发送的 HTTP 请求,并将请求数据存储在 beast::flat_buffer 中。
- 在接收到完整的 HTTP 请求后,HttpConnection 会解析请求,提取 URL 和请求方法(如 GET 或 POST)。
- HttpConnection 将请求转交给 LogicSystem,LogicSystem 根据请求的 URL 查找对应的回调函数(HttpHandler),并执行该回调函数进行处理。
- 回调函数处理完请求后,HttpConnection 将生成相应的 HTTP 响应,并异步将响应数据发送回客户端。
- 如果连接在规定时间内未完成处理,HttpConnection 会触发定时器,主动关闭连接,避免资源浪费。
3. 模块详细设计
由于代码太长,源码我给出链接
源码下载地址,密码:bhmyhttps://wwta.lanzoue.com/iqugu2k8shij
3.1 CServer 模块
CServer 类是整个 HTTP 服务器的入口,负责启动服务器,监听并接受来自客户端的连接。它依赖于 Boost.Asio 库提供的 tcp::acceptor 来监听指定的端口。当客户端连接到服务器时,CServer 会为每个连接创建一个新的 HttpConnection 对象来处理该连接。
关键函数:
- Start():启动服务器并开始接受客户端连接。
- Accept():异步接受客户端连接,当有新的连接请求时调用 HttpConnection 来处理。
CServer 的主要任务是创建和管理连接,每当有新的连接请求时,它会为该连接创建一个 HttpConnection 对象,后者将负责处理 HTTP 请求。
#ifndef CSERVER_H
#define CSERVER_H
#include "const.h"// CServer 类,负责接受客户端连接并处理连接请求
class CServer :public std::enable_shared_from_this<CServer> {
public:CServer(boost::asio::io_context& ioc, unsigned short& port);// 构造函数:初始化服务器并绑定到指定端口void Start(); // 启动服务器,开始接受连接
private:tcp::acceptor _acceptor;// 用于接受 TCP 连接的接受器net::io_context& _ioc;// 提供 I/O 服务的上下文对象tcp::socket _socket;// 用于与客户端通信的套接字
};
#endif
3.2 HttpConnection 模块
HttpConnection 类管理每一个客户端的 HTTP 连接。它负责异步读取客户端请求,解析 HTTP 请求,查找 URL 对应的回调函数,并生成 HTTP 响应返回给客户端。此外,HttpConnection 还负责超时管理,通过 Boost.Asio 的 steady_timer 来确保每个连接的生命周期不会过长,从而避免资源泄漏。
关键函数:
- Start():启动连接,开始处理 HTTP 请求。
- HandleReq():处理 HTTP 请求,包括解析请求内容并根据请求方法调用相应的回调函数。
- CheckDeadline():检查当前连接是否超时,超时则关闭连接。
- WriteResponse():将生成的 HTTP 响应数据写入客户端。
HttpConnection 的任务是在接收到请求后,解析出请求的方法(GET/POST)、URL 和参数,并将其传递给 LogicSystem 来进行后续的处理。最终,将服务器的响应发送给客户端。
#ifndef HTTPCONNECTION_H
#define HTTPCONNECTION_H
#include "const.h"// HttpConnection 类,负责与客户端的 HTTP 连接
// 提供处理 HTTP 请求、定时器管理等功能
class HttpConnection :public std::enable_shared_from_this<HttpConnection> {friend class LogicSystem;// 允许 LogicSystem 访问 HttpConnection 的私有成员
public:HttpConnection(tcp::socket socket);// 构造函数:接受 TCP 套接字,初始化连接void Start(); // 启动连接处理
private:void CheckDeadline();// 检查是否超时,定时器功能void WriteResponse();// 写入响应数据void HandleReq(); // 处理 HTTP 请求void PreParseGetParam();//处理参数解析tcp::socket _socket;// 客户端套接字beast::flat_buffer _buffer{ 8192 };// 接收数据的缓冲区,最大缓存 8192 字节http::request<http::dynamic_body> _request;// HTTP 请求对象,存储接收到的 HTTP 请求数据http::response<http::dynamic_body> _response;// HTTP 响应对象,存储响应数据并发送给客户端// 定时器,检查连接是否超时,60 秒后自动关闭连接net::steady_timer deadline_{_socket.get_executor(),std::chrono::seconds(60)};std::string _get_url; // 存储请求的 URLstd::unordered_map<std::string, std::string> _get_params;// 存储 GET 请求的查询参数,以键值对形式存储
};#endif
3.3 LogicSystem 模块
LogicSystem 类是整个系统的核心,负责管理 HTTP 请求的路由与回调函数。它采用 单例模式 确保系统中只有一个逻辑处理实例,并通过 std::map 存储 GET 和 POST 请求的回调函数。每当 HTTP 请求到来时,HttpConnection 会将请求的 URL 传递给 LogicSystem,然后根据请求方法(GET/POST)查找并执行对应的回调函数。
关键函数:
- RegGet():注册 GET 请求的回调函数。
- RegPost():注册 POST 请求的回调函数。
- HandleGet():处理 GET 请求,执行对应的回调函数。
- HandlePost():处理 POST 请求,执行对应的回调函数。
LogicSystem 是一个单例类,它为每个请求类型(GET/POST)提供了 URL 到回调函数的映射表。当请求到来时,LogicSystem 会根据请求的 URL 查找相应的回调函数并执行,从而实现不同 URL 对应不同的处理逻辑。
#ifndef LOGICSYSTEM_H
#define LOGICSTSTEM_H
#include "Singleton.h"
#include <functional>
#include <map>
#include "const.h"class HttpConnection;typedef std::function<void(std::shared_ptr<HttpConnection>)> HttpHandler;// 定义一个回调函数类型,处理 HTTP 请求
// HttpHandler 通过 shared_ptr 传递 HttpConnection 对象// LogicSystem 类,用于管理 HTTP 请求的逻辑处理
// 采用单例模式,确保系统只有一个实例
class LogicSystem : public Singleton<LogicSystem> {friend class Singleton<LogicSystem>; // 允许 Singleton 类访问 LogicSystem 的构造函数
public:~LogicSystem();// 析构函数,负责释放资源bool HandleGet(std::string path, std::shared_ptr<HttpConnection> con); // 处理GET请求的函数bool HandlePost(std::string path, std::shared_ptr<HttpConnection> con);//处理POST请求的函数void RegGet(std::string url, HttpHandler handler);// 注册 GET 请求的回调函数void RegPost(std::string url, HttpHandler handler);// 注册POST请求的回调函数
private:LogicSystem(); // 构造函数,私有化以防外部直接创建实例//key为路由,value为回调函数std::map<std::string, HttpHandler> _post_handlers; // 存储 POST 请求的处理函数std::map<std::string, HttpHandler> _get_handlers; // 存储 GET 请求的处理函数
};
#endif
3.4 Singleton 模块
Singleton 模块通过模板实现了单例模式,确保系统中的核心组件(如 LogicSystem)只有一个实例。该模板类使用懒汉式初始化,确保在首次访问时才创建实例,并且每次访问都返回同一个实例。
关键函数:
- GetInstance():获取单例实例,如果实例尚未创建,则进行初始化。
- PrintAddress():打印当前单例实例的地址,便于调试。
Singleton 模块保证了系统中只有一个实例,可以有效避免重复实例化带来的资源浪费。通过使用 std::shared_ptr 管理实例的生命周期,确保实例的销毁是在所有引用都释放后进行的。
#ifndef SINGLETON_H
#define SINGLETON_H
#include <mutex>
#include <iostream>
#include <memory>// Singleton 模板类,确保一个类只有一个实例
// 使用 std::shared_ptr 来管理实例生命周期
template <typename T>
class Singleton {
protected:Singleton() = default; // 默认构造函数,防止外部实例化Singleton(const Singleton<T>&) = delete; // 禁止拷贝构造Singleton& operator=(const Singleton<T>& st) = delete; // 禁止拷贝赋值static std::shared_ptr<T> _instance;// 存储单例实例的静态变量
public:// 获取单例实例,线程安全的懒汉式初始化static std::shared_ptr<T> GetInstance() {static std::once_flag s_flag;// 用于确保单例实例只被创建一次std::call_once(s_flag, [&]() {// 创建单例实例并保存在 _instance 中_instance = std::shared_ptr<T>(new T);});return _instance;// 返回单例实例}// 打印当前单例实例的地址void PrintAddress() {std::cout << _instance.get() << std::endl;}// 析构函数,打印销毁信息~Singleton() {std::cout << "this is singleton destruct" << std::endl;}
};// 为单例提供静态变量的初始化
template<typename T>
std::shared_ptr<T>Singleton<T>::_instance = nullptr;
#endif
4.测试
输入http://localhost:8080/get_test
显示receive get_test req
输入http://localhost:8080/get_test?key1=value1&key2=value2
显示
receive get_test req param1key iskey1, value isvalue1 param2key iskey2, value isvalue2
相关文章:

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)
已完成功能: 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...

有机物谱图信息的速查技巧有哪些?
谱图信息是化学家解读分子世界的“语言”,它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键,对化学家来说极为重要,每一种谱学技术都提供了不同的视角来观察分子,从而揭示其独特的化学和物理特性…...
Eureka缓存机制
一、Eureka的CAP特性 Eureka是一个AP系统,它优先保证可用性(A)和分区容错性(P),而不保证强一致性(C)。这种设计使得Eureka在分布式系统中能够应对各种故障和分区情况,保…...
【LC】78. 子集
题目描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出࿱…...

协同过滤算法私人诊所系统|Java|SpringBoot|VUE|
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…...
Docker部署Naocs-- 超细教程
Docker 拉取镜像 docker pull nacos/nacos-server:v2.2.0 挂载目录 如果不是root账号 前面加sudo 或者 切换root账号 su root(命令) mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p /mydata/nacos/conf/ #新建conf目录 启动容器…...

[java基础-集合篇]优先队列PriorityQueue结构与源码解析
优先队列PriorityQueue 优先级队列表示为平衡二进制堆: queue[n] 的两个子级是 queue[2*n1] 和 queue[2*(n1)]。 注:左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…...
12. C语言 数组与指针(深入理解)
本章目录: 前言1. 什么是数组?2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...

Postman接口测试基本操作
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Postman-获取验证码 需求:使用Postman访问验证码接口,并查看响应结果。 地址:http://kdtx-test.itheima.net/api/captchaIm…...

MySQL--2.1MySQL的六种日志文件
大家好,我们来说一下MySQL的6中日志文件。 1.查询日志 查询日志主要记录mysql的select查询的,改配置是默认关闭的。不推荐开启,因为会导致大量查询日志文件储存占用你的空间。 举例查询一下 select * from class; 开启查询日志的命…...
spring task使用
Spring Task 简介 Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Sprin…...

【FPGA】时序约束与分析
设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…...
LLM的MoE由什么构成:门控网络,专家网络
LLM的MoE由什么构成:门控网络,专家网络 目录 LLM的MoE由什么构成:门控网络,专家网络专家网络门控网络MoE在联邦学习中的使用及原理专家网络 定义与特点:是一组独立的模型,每个模型都负责处理某个特定的子任务或学习输入空间的特定部分。这些专家可以是简单的线性回归模型…...
HTML-多媒体标签
除了图像,网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素,用于放置视频。如果浏览器支持加载的视频格式,就会显示一个播放器,否则显示<video>内部的子元素。 <video src"example.…...

MySQL笔记大总结20250108
Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…...

stm32week3
stm32学习 二.外设 8.TIM输出比较 OC(output compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0、翻转操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的…...

uniapp 的uni.getRecorderManager() 录音功能小记
官网上明确说的是全局唯一并且只是获取对象,所以会导致一个问题就是,当你多个页面要用到这个对象的时候,会发现 onStop 方法会被覆盖,导致调用结果不是自己想要的 解决办法也简单粗暴,在需要用到的界面重新覆盖onStop…...

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…...

RT-DETR代码详解(官方pytorch版)——参数配置(1)
前言 RT-DETR虽然是DETR系列,但是它的代码结构和之前的DETR系列代码不一样。 它是通过很多的yaml文件进行参数配置,和之前在train.py的parser argparse.ArgumentParser()去配置所有参数不同,所以刚开始不熟悉代码的时候可能不知道在哪儿修…...

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器
作品简介 在CTFer选手比赛做crypto的题目时,一些题目需要自己去解密,但是解密的工具大部分在线上,而在比赛过程中大部分又是无网环境,所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计,通过…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...