使用 Poco C++ 库构建轻量级 HTTP 服务器

在现代 C++ 后端开发中,如果你需要构建一个轻量、高性能、可嵌入式的 HTTP 服务,而不愿引入重量级框架如 Boost.Beast 或 cpp-httplib,那么 Poco C++ Libraries 提供了一个优雅的解决方案。Poco 是一套广泛使用的 C++ 框架,涵盖网络、线程、文件系统、JSON/XML 等模块。

本篇文章将手把手教你如何使用 Poco 构建一个基础的 HTTP Server,并扩展为一个具备实际用途的请求处理器。


✨ 为什么选择 Poco?

  • 易于集成,无外部依赖(仅需 CMake + 编译 Poco)

  • 支持多线程、高并发

  • 内置 HTTPServer、WebSocket、REST 支持

  • 类似 Java Servlet 模型:请求/响应 + 工厂 + Handler

    cpp 复制代码
    my_http_server/
    ├── CMakeLists.txt
    ├── MyHttpApp.h
    ├── MyHttpApp.cpp
    ├── RequestHandlerFactory.h
    ├── RequestHandlerFactory.cpp
    └── main.cpp

    项目结构

    cpp 复制代码
    // RequestHandlerFactory.h
    #pragma once
    #include <Poco/Net/HTTPRequestHandlerFactory.h>
    #include <Poco/Net/HTTPRequestHandler.h>
    #include <Poco/Net/HTTPServerRequest.h>
    #include <Poco/Net/HTTPServerResponse.h>
    
    class RequestHandler : public Poco::Net::HTTPRequestHandler {
    public:
        void handleRequest(Poco::Net::HTTPServerRequest& request,
                           Poco::Net::HTTPServerResponse& response) override;
    };
    
    class RequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
    public:
        Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest&) override;
    };
    cpp 复制代码
    // RequestHandlerFactory.cpp
    #include "RequestHandlerFactory.h"
    #include <iostream>
    
    void RequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request,
                                       Poco::Net::HTTPServerResponse& response) {
        response.setStatus(Poco::Net::HTTPResponse::HTTP_OK);
        response.setContentType("text/plain");
    
        std::ostream& ostr = response.send();
        ostr << "Hello from Poco ServerApplication HTTP Server!\n";
    }
    
    Poco::Net::HTTPRequestHandler* RequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest&) {
        return new RequestHandler;
    }
    cpp 复制代码
    #pragma once
    #include <Poco/Util/ServerApplication.h>
    #include <Poco/Net/HTTPServer.h>
    #include <Poco/Net/HTTPServerParams.h>
    #include <Poco/Net/ServerSocket.h>
    
    class MyHttpApp : public Poco::Util::ServerApplication {
    protected:
        int main(const std::vector<std::string>& args) override;
    };
    cpp 复制代码
    #include "MyHttpApp.h"
    #include "RequestHandlerFactory.h"
    #include <iostream>
    
    int MyHttpApp::main(const std::vector<std::string>& args) {
        Poco::UInt16 port = 8080;
        Poco::Net::ServerSocket svs(port);
    
        Poco::Net::HTTPServerParams* params = new Poco::Net::HTTPServerParams;
        params->setMaxQueued(100);
        params->setMaxThreads(8);
    
        Poco::Net::HTTPServer server(new RequestHandlerFactory, svs, params);
        server.start();
        std::cout << "HTTP server started on port " << port << std::endl;
    
        waitForTerminationRequest();  // 等待 Ctrl+C 或 kill 信号
        std::cout << "Shutting down..." << std::endl;
        server.stop();
    
        return Application::EXIT_OK;
    }
    cpp 复制代码
    //main.cpp
    #include "MyHttpApp.h"
    
    int main(int argc, char** argv) {
        MyHttpApp app;
        return app.run(argc, argv);
    }
    cpp 复制代码
    #CMakeLists.txt
    cmake_minimum_required(VERSION 3.10)
    project(MyPocoHttpServer)
    
    find_package(Poco REQUIRED Net Util Foundation)
    
    add_executable(server
        main.cpp
        MyHttpApp.cpp
        RequestHandlerFactory.cpp
    )
    
    target_link_libraries(server
        Poco::Net
        Poco::Util
        Poco::Foundation
    )

    构建和运行

    bash 复制代码
    mkdir build && cd build
    cmake ..
    make
    ./server
相关推荐
TOPGUS1 小时前
谷歌Chrome浏览器即将对HTTP网站设卡:突出展示“始终使用安全连接”功能
前端·网络·chrome·http·搜索引擎·seo·数字营销
十五年专注C++开发1 小时前
VS2019编译的C++程序,在win10正常运行,在win7上Debug正常运行,Release运行报错0xC0000005,进不了main函数
开发语言·c++·报错c0x0000005
一条咸鱼_SaltyFish1 小时前
[Day13] 微服务架构下的共享基础库设计:contract-common 模块实践
开发语言·人工智能·微服务·云原生·架构·ai编程
隐退山林1 小时前
JavaEE:多线程初阶(一)
java·开发语言·jvm
Wadli1 小时前
项目5 |HTTP服务框架
网络·网络协议·http
C_心欲无痕1 小时前
ts - 模板字面量类型与 `keyof` 的魔法组合:`keyof T & `on${string}`使用
linux·运维·开发语言·前端·ubuntu·typescript
fy zs1 小时前
网络编程套接字
linux·服务器·网络·c++
最贪吃的虎1 小时前
Redis其实并不是线程安全的
java·开发语言·数据库·redis·后端·缓存·lua
fpcc1 小时前
模板编程—模板和元编程中的错误输出
c++·模板编程
CCPC不拿奖不改名2 小时前
网络与API:HTTP基础+面试习题
网络·python·网络协议·学习·http·面试·职场和发展