C++怎么使用Boost.Beast实现HTTP/WebSocket服务器_C++网络编程与Boost.Beast应用

27次阅读

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

C++ 怎么使用 Boost.Beast 实现 HTTP/WebSocket 服务器_C++ 网络编程与 Boost.Beast 应用

用 C ++ 实现 HTTP 和 WebSocket 服务器,Boost.Beast 是一个现代、高效且基于 标准库 风格的 网络编程 库。它构建在 Boost.Asio 之上,提供了清晰的 接口 来处理 HTTP 协议和 WebSocket 通信。下面介绍如何使用 Boost.Beast 搭建一个支持 HTTP 和 WebSocket 的简单服务器。

1. 环境准备与依赖配置

确保已安装 Boost 库(建议 1.66 及以上版本),并正确配置编译环境。Beast 是头文件库,无需单独编译,但依赖 Boost.Asio 和系统网络库。

安装 Boost(ubuntu示例):

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++ 免费学习笔记(深入)”;

C++ 怎么使用 Boost.Beast 实现 HTTP/WebSocket 服务器_C++ 网络编程与 Boost.Beast 应用

AppMall 应用商店

ai应用商店,提供即时交付、按需付费的人工智能应用服务

C++ 怎么使用 Boost.Beast 实现 HTTP/WebSocket 服务器_C++ 网络编程与 Boost.Beast 应用 56

查看详情 C++ 怎么使用 Boost.Beast 实现 HTTP/WebSocket 服务器_C++ 网络编程与 Boost.Beast 应用

#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 ++ 编写现代网络服务变得简洁可控。关键是理解其基于回调的异步模型,并合理管理 对象 生命周期。不复杂但容易忽略。

站长
版权声明:本站原创文章,由 站长 2025-11-10发表,共计3195字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources