在现代 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
my_http_server/
├── CMakeLists.txt
├── MyHttpApp.h
├── MyHttpApp.cpp
├── RequestHandlerFactory.h
├── RequestHandlerFactory.cpp
└── main.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;
};
// 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;
}
#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;
};
#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;
}
//main.cpp
#include "MyHttpApp.h"int main(int argc, char** argv) {
MyHttpApp app;
return app.run(argc, argv);
}
#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
)构建和运行
mkdir build && cd build
cmake ..
make
./server
评论前必须登录!
注册