优秀网站的链接,wordpress菜单与页面关联,vps网站解析域名,周口河南网站建设已完成功能#xff1a; 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制#xff0c;可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景
1.1 项目简介
本项目是一个基于… 已完成功能 支持 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 将请求转交给 LogicSystemLogicSystem 根据请求的 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_thisCServer {
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;// 用于与客户端通信的套接字
};
#endif3.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_thisHttpConnection {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::requesthttp::dynamic_body _request;// HTTP 请求对象存储接收到的 HTTP 请求数据http::responsehttp::dynamic_body _response;// HTTP 响应对象存储响应数据并发送给客户端// 定时器检查连接是否超时60 秒后自动关闭连接net::steady_timer deadline_{_socket.get_executor(),std::chrono::seconds(60)};std::string _get_url; // 存储请求的 URLstd::unordered_mapstd::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.hclass HttpConnection;typedef std::functionvoid(std::shared_ptrHttpConnection) HttpHandler;// 定义一个回调函数类型处理 HTTP 请求
// HttpHandler 通过 shared_ptr 传递 HttpConnection 对象// LogicSystem 类用于管理 HTTP 请求的逻辑处理
// 采用单例模式确保系统只有一个实例
class LogicSystem : public SingletonLogicSystem {friend class SingletonLogicSystem; // 允许 Singleton 类访问 LogicSystem 的构造函数
public:~LogicSystem();// 析构函数负责释放资源bool HandleGet(std::string path, std::shared_ptrHttpConnection con); // 处理GET请求的函数bool HandlePost(std::string path, std::shared_ptrHttpConnection con);//处理POST请求的函数void RegGet(std::string url, HttpHandler handler);// 注册 GET 请求的回调函数void RegPost(std::string url, HttpHandler handler);// 注册POST请求的回调函数
private:LogicSystem(); // 构造函数私有化以防外部直接创建实例//key为路由value为回调函数std::mapstd::string, HttpHandler _post_handlers; // 存储 POST 请求的处理函数std::mapstd::string, HttpHandler _get_handlers; // 存储 GET 请求的处理函数
};
#endif3.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 SingletonT) delete; // 禁止拷贝构造Singleton operator(const SingletonT st) delete; // 禁止拷贝赋值static std::shared_ptrT _instance;// 存储单例实例的静态变量
public:// 获取单例实例线程安全的懒汉式初始化static std::shared_ptrT GetInstance() {static std::once_flag s_flag;// 用于确保单例实例只被创建一次std::call_once(s_flag, []() {// 创建单例实例并保存在 _instance 中_instance std::shared_ptrT(new T);});return _instance;// 返回单例实例}// 打印当前单例实例的地址void PrintAddress() {std::cout _instance.get() std::endl;}// 析构函数打印销毁信息~Singleton() {std::cout this is singleton destruct std::endl;}
};// 为单例提供静态变量的初始化
templatetypename T
std::shared_ptrTSingletonT::_instance nullptr;
#endif4.测试 输入http://localhost:8080/get_test 显示receive get_test req 输入http://localhost:8080/get_test?key1value1key2value2 显示 receive get_test req
param1key iskey1, value isvalue1
param2key iskey2, value isvalue2