0

0

c++如何实现一个简单的WebSocket客户端_c++ Beast库网络编程【实战】

尼克

尼克

发布时间:2026-01-13 14:07:02

|

232人浏览过

|

来源于php中文网

原创

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

c++如何实现一个简单的websocket客户端_c++ beast库网络编程【实战】

用 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.hppboost/beast.hpp

例如在 Ubuntu 上:sudo apt install libboost-dev libboost-system-dev libboost-regex-devmacOS 用 brew install boost。Windows 下建议用 vcpkg:vcpkg install boost-beast:x64-windows

2. 同步 WebSocket 客户端:连接、发消息、收响应

以下是一个最小可运行的同步客户端示例(连接 echo.websocket.org 测试):

立即学习C++免费学习笔记(深入)”;

#include 
#include 
#include 
#include 
#include 
#include 

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 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

MuleRun
MuleRun

全球首个AI Agent交易平台

下载

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>>,并加载证书(如验证服务器证书可用 ctx.set_verify_mode(ssl::verify_none) 快速跳过)

基本上就这些。Beast 把 WebSocket 的复杂性屏蔽得很好,专注业务逻辑即可。写对一次 handshake 和 read/write 循环,后面扩展订阅、心跳、JSON 解析都很自然。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

44

2026.01.05

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

387

2023.07.18

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号