# HPServer **Repository Path**: TechKnight/hpserver ## Basic Information - **Project Name**: HPServer - **Description**: 仿 mudo 高并发服务器 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-02-26 - **Last Updated**: 2024-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HPServer --- #### 项目概述: 本项目是一个高性能的TCP服务器框架(High Performance Server -> HPServer),灵感来源于 mudo,为高并发场景设计。它支持灵活配置,能够轻松搭建适配多种应用层协议的服务器。目前,项目已经实现了对HTTP协议的支持,提供了一个功能完备的HttpServer组件。 #### 核心特性: * 高并发处理能力:采用I/O多路复用技术,能够应对更大的并发量请求 * 自动断开不活跃连接:内置定时器会定时断开长期不活跃连接,从而优化资源使用和提升服务器效率 * 协议灵活性:设计了可扩展的协议处理框架,允许开发者根据需要快速集成或开发新的应用层协议支持。 * HTTP服务器实现:项目基于 HPServer 实现了一个基于高效的 HttpServer,遵循HTTP协议标准,采用 RESTful 风格接口设计,适用于各种 Web 应用服务。 #### 系统架构: 下面是一些小插图,帮助大家理解 TCPServer 的架构: ![image-20240314170600226](https://pictures-store.oss-cn-hangzhou.aliyuncs.com/img/202403141706281.png) ![image-20240314170633232](https://pictures-store.oss-cn-hangzhou.aliyuncs.com/img/202403141706298.png) ![image-20240314171846689](https://pictures-store.oss-cn-hangzhou.aliyuncs.com/img/202403141718760.png) #### 快速开始: 本项目采用 header-only 的设计方式,这意味着您无需进行复杂的编译或链接步骤,只需要包含 src 下的头文件即可。 **TCPServer 使用案例:** ```cpp #include "./tcpserver.hpp" class EchoServer { private: TcpServer server_; private: void OnConnected(const ConPtr &conn) { DBG_LOG("NEW CONNECTION:%p", conn.get()); } void OnClosed(const ConPtr &conn) { DBG_LOG("CLOSE CONNECTION:%p", conn.get()); } void OnEvent(const ConPtr &conn) { DBG_LOG("Event was triggerd"); } void OnMessage(const ConPtr &conn, Buffer *buf) { conn->deliver(buf->getReaderAddr(), buf->getValidSize()); buf->moveReaderPos(buf->getValidSize()); conn->shutdown(); } public: EchoServer(int port, int thread_size = 2, bool noblock = true) : server_(port, thread_size, noblock) { // 关闭 60s 不活跃的连接 server_.enableTimeOut(60); // 设置回调函数 server_.setCloseCb(std::bind(&EchoServer::OnClosed, this,std::placeholders::_1)); server_.setConnectedCb(std::bind(&EchoServer::OnConnected,this, std::placeholders::_1)); server_.setMessageCb(std::bind(&EchoServer::OnMessage, this,std::placeholders::_1, std::placeholders::_2)); server_.setAnyEventCb(std::bind(&EchoServer::OnEvent, this, std::placeholders::_1)); } void Start() { server_.start(); } }; ``` TCPServer 在连接的四个关键节点设置 hook,允许用户根据需求进行高度定制: * ConnectedCb:TCP连接建立时自动调用的回调函数 * MessageCb:收到用户消息时自动调用的回调函数 * AnyEventCb:任何事件触发都会被调用的回调函数 * CloseCb:连接关闭时调用的回调函数 **HTTPServer 使用案例:** ```cpp #include "httpserver.hpp" std::string echoReq(const HttpRequest& req){ std::stringstream ss; ss << req.method_ << " " << req.path_ << " " << req.version_ << "\r\n"; for(const auto& e : req.params_){ ss << e.first << " " << e.second << "\r\n"; } for(const auto& e : req.headers_){ ss << e.first << ": " << e.second << "\r\n"; } ss << "\r\n"; ss << req.body_; return ss.str(); } void hello(const HttpRequest& req, HttpResponse* rsp){ rsp->setContent(echoReq(req), "text/plain"); } void upload(const HttpRequest& req, HttpResponse* rsp){ Util::writeFile("./WWWROOT" + req.path_, req.body_); DBG_LOG("upload success"); } int main(){ HttpServer svr(8080, 2); svr.setRootDir("./WWWROOT"); // 需要设置静态资源根目录 svr.Get("/hi\\(d+)", hello); svr.Put("/upload", upload); svr.listen(); // 开启服务 } ``` 支持的方法有:get、put、delete、post。路径匹配中对正则表达式提供了支持 #### 边界测试: 对于一些较为极端情况的测试都已经通过: ✅ 长连接测试 ✅ 超时断开连接测试 ✅ 处理超时测试 ✅ 大文件传输测试 #### 参与贡献 1. Fork 本仓库 2. 新建 develop 分支 3. 提交代码 4. 新建 Pull Request