beast库是c++实现websocket客户端最成熟推荐方案,基于boost.asio封装协议细节,无需手动处理握手、帧解析等;需c++14+及boost 1.69+,支持同步/异步模式,注意buffer生命周期与同步异步混用问题。

用 C++ 实现 WebSocket 客户端,Beast 库(Boost.Beast)是最成熟、最推荐的选择——它基于 Boost.Asio,封装了 WebSocket 协议细节,无需自己处理握手、帧解析、掩码、ping/pong 等底层逻辑。
1. 环境准备:安装 Beast 并确认依赖
Beast 是头文件库,**不需要编译安装**,但需满足:
- C++14 或更高(推荐 C++17)
- Boost 1.69+(Beast 自 1.69 起正式集成进 Boost)
- 确保编译器能访问
boost/asio.hpp和boost/beast.hpp
例如在 Ubuntu 上:sudo apt install libboost-dev libboost-system-dev libboost-regex-dev;macOS 用 brew install boost。Windows 下建议用 vcpkg:vcpkg install boost-beast:x64-windows。
2. 同步 WebSocket 客户端:连接、发消息、收响应
以下是一个最小可运行的同步客户端示例(连接 echo.websocket.org 测试):
立即学习“C++免费学习笔记(深入)”;
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <iostream>
#include <string>
namespace beast = boost::beast;
namespace http = beast::http;
namespace net = boost::asio;
namespace websocket = beast::websocket;
int main() {
try {
net::io_context ioc;
tcp::resolver resolver{ioc};
websocket::stream<tcp::socket> ws{ioc};
// 解析地址并连接
auto const results = resolver.resolve("echo.websocket.org", "80");
net::connect(ws.next_layer(), results);
// WebSocket 握手(HTTP 升级)
ws.handshake("echo.websocket.org", "/");
// 发送文本消息
ws.write(net::buffer(std::string("Hello, WebSocket!")));
// 接收响应
beast::flat_buffer buffer;
ws.read(buffer);
std::cout << "Received: " << beast::make_printable(buffer.data()) << "\n";
ws.close(websocket::close_code::normal);
}
catch (std::exception const& e) {
std::cerr << "Error: " << e.what() << "\n";
return -1;
}
return 0;
}
编译命令(Linux/macOS):g++ -std=c++17 -O2 client.cpp -lboost_system -pthread -o client
3. 异步 WebSocket 客户端:支持多消息、自动重连
实际项目中推荐异步模式。关键点:
- 所有操作(connect/handshake/write/read)都以
async_*开头,传入回调 lambda 或 handler - 读写需手动循环(read → 处理 → read,或 write → on_write → write)
- 用
ws.set_option(websocket::stream_base::timeout::suggested(beast::role_type::client))避免卡死 - 添加 ping 自动响应:
ws.auto_ping(true)
核心结构示意:
void do_read() {
ws.async_read(buffer, [self = shared_from_this()](error_code ec, std::size_t bytes) {
if (ec == websocket::error::closed) return;
if (ec) return fail(ec, "read");
// 处理收到的数据
self->do_read(); // 继续监听
});
}
void do_write(std::string msg) {
ws.text(true);
ws.async_write(net::buffer(msg), [self = shared_from_this()](error_code ec, std::size_t) {
if (ec) return fail(ec, "write");
// 可选:写完立刻再读,或等待用户输入后写
});
}
4. 注意事项与常见坑
Beast 使用简单,但几个细节容易出错:
-
不要混用同步和异步流:同一个
websocket::stream对象不能既调read()又调async_read() -
buffer 生命周期必须长于 async 操作:用
beast::flat_buffer或堆上分配,避免栈变量被提前析构 -
关闭前务必调
close():直接析构 socket 可能导致对方收不到 close 帧,连接异常中断 -
SSL 支持需额外配置:用
websocket::stream<:stream>></:stream>,并加载证书(如验证服务器证书可用ctx.set_verify_mode(ssl::verify_none)快速跳过)
基本上就这些。Beast 把 WebSocket 的复杂性屏蔽得很好,专注业务逻辑即可。写对一次 handshake 和 read/write 循环,后面扩展订阅、心跳、JSON 解析都很自然。











