使用Boost.Beast可实现支持http和websocket的c++服务器:1. 配置Boost环境并链接依赖库;2. 通过beast::http实现HTTP请求响应;3. 利用beast::websocket处理升级请求并建立长连接;4. 使用asio异步监听客户端连接,统一分发处理。

用C++实现HTTP和WebSocket服务器,Boost.Beast是一个现代、高效且基于标准库风格的网络编程库。它构建在Boost.Asio之上,提供了清晰的接口来处理HTTP协议和WebSocket通信。下面介绍如何使用Boost.Beast搭建一个支持HTTP和WebSocket的简单服务器。
1. 环境准备与依赖配置
确保已安装Boost库(建议1.66及以上版本),并正确配置编译环境。Beast是头文件库,无需单独编译,但依赖Boost.Asio和系统网络库。
sudo apt-get install libboost-all-dev
编译时链接必要的系统库:
g++ -std=c++17 server.cpp -lboost_system -lpthread
2. 实现HTTP服务器
Beast提供对HTTP消息的完整支持。以下是一个响应静态字符串的HTTP服务器片段:
#include <boost/beast/core.hpp> #include <boost/beast/http.hpp> #include <boost/beast/version.hpp> #include <boost/asio/ip/tcp.hpp> #include <memory> #include <string> namespace beast = boost::beast; namespace http = beast::http; namespace net = boost::asio; using tcp = net::ip::tcp; // 发送HTTP响应 void send_response(http::response<http::string_body>& response, tcp::socket& socket) { auto msg = std::make_shared<http::response<http::string_body>>(std::move(response)); http::async_write(socket, *msg, [&socket, msg](beast::error_code ec, std::size_t) { socket.shutdown(tcp::socket::shutdown_send, ec); socket.close(); }); } // 处理HTTP请求 void handle_request(tcp::socket socket, http::request<http::string_body> req) { http::response<http::string_body> res{http::status::ok, req.version()}; res.set(http::field::server, "Boost.Beast"); res.body() = "Hello from HTTP server!"; res.prepare_payload(); send_response(std::move(res), std::move(socket)); } // 接收请求 void do_session(tcp::socket socket) { beast::flat_buffer buffer; http::request<http::string_body> req; http::async_read(socket, buffer, req, [&socket, buffer = std::move(buffer)] (beast::error_code ec, std::size_t) mutable { if(!ec) handle_request(std::move(socket), std::move(req)); }); }
3. 添加WebSocket支持
WebSocket连接通常从HTTP升级请求开始。Beast可检测并升级到WebSocket会话。
立即学习“C++免费学习笔记(深入)”;
#include <boost/beast/websocket.hpp> namespace websocket = beast::websocket; class websocket_session : public std::enable_shared_from_this<websocket_session> { websocket::stream<tcp::socket> ws_; public: explicit websocket_session(tcp::socket socket) : ws_(std::move(socket)) {} void run() { ws_.async_accept( [self = shared_from_this()](beast::error_code ec) { if(ec) return; self->do_read(); }); } void do_read() { ws_.async_read( buffer_, [self = shared_from_this()](beast::error_code ec, std::size_t) { if(ec) return; self->do_write(); }); } void do_write() { ws_.text(ws_.got_text()); ws_.async_write( buffer_.data(), [self = shared_from_this()](beast::error_code ec, std::size_t) { if(ec) return; self->do_read(); }); } private: beast::flat_buffer buffer_; }; // 检查是否为WebSocket升级请求 bool is_websocket_upgrade(const http::request<http::string_body>& req) { return req.method() == http::verb::get && req.target() == "/ws" && req[http::field::upgrade] == "websocket"; }
在主处理逻辑中判断请求类型:
if(is_websocket_upgrade(req)) { std::make_shared<websocket_session>(std::move(socket))->run(); } else { handle_request(std::move(socket), std::move(req)); }
4. 启动监听服务
使用Asio的io_context启动TCP监听:
int main() { net::io_context ioc; tcp::acceptor acceptor(ioc, {tcp::v4(), 8080}); while(true) { tcp::socket socket(ioc); acceptor.accept(socket); do_session(std::move(socket)); } }
更高效的写法是使用异步accept结合`net::dispatch`管理生命周期,避免阻塞循环。
基本上就这些。Boost.Beast通过组合HTTP和WebSocket组件,让C++编写现代网络服务变得简洁可控。关键是理解其基于回调的异步模型,并合理管理对象生命周期。不复杂但容易忽略。