You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost-Beast异步WebSocket服务端-客户端读写异常:控制台无输出

解决Boost Beast异步WebSocket服务端无法提取并打印收到消息的问题

我帮你梳理下当前遇到的问题,然后一步步给出解决方案:

为什么buffer_.data().data()只显示内存地址?

buffer_.data()返回的是beast::flat_buffer对应的缓冲区序列,直接调用.data()拿到的是底层内存指针,输出指针自然只会显示内存地址,而不是实际的字符串内容。要提取消息,得把缓冲区里的字节转换成C++字符串。

如何从套接字缓冲区提取字符串?

Boost Beast提供了beast::buffers_to_string()工具函数,能直接把缓冲区序列转换成std::string,非常好用。你可以修改on_read函数里的输出逻辑:

// 替换原来的 std::cout << buffer_.data().data()<< std::endl;
std::string received_msg = beast::buffers_to_string(buffer_.data());
std::cout << "收到客户端消息: " << received_msg << std::endl;

另外别忘了,处理完缓冲区数据后,要调用buffer_.consume(bytes_transferred)释放已处理的字节,避免下次读取重复处理旧数据。

如何验证WebSocket服务端功能正常?

可以分这几步逐步验证:

  • 确认连接建立:在服务端的on_accept回调里添加日志,比如std::cout << "客户端已连接" << std::endl;,确保客户端能成功连到服务端;
  • 检查消息读取:用上面的方法提取字符串并打印,确认收到的内容和客户端发送的"Hello"一致;
  • 验证回显功能:在客户端代码里添加on_read回调,打印服务端的回显消息,确认双向通信正常;
  • 错误排查:确保fail函数能正确打印错误信息,如果读取过程中有异常,能及时定位问题。

修改后的完整on_read示例代码

void on_read(beast::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);
    // 会话已关闭的情况
    if (ec == websocket::error::closed) {
        std::cout << "客户端主动关闭会话" << std::endl;
        return;
    }
    if (ec) {
        fail(ec, "read");
        return;
    }

    // 提取并打印收到的消息
    std::string received_msg = beast::buffers_to_string(buffer_.data());
    std::cout << "收到客户端消息: " << received_msg << std::endl;

    // 执行回显逻辑
    ws_.text(ws_.got_text());
    std::cout << "正在回显消息给客户端..." << std::endl;
    ws_.async_write(buffer_.data(), beast::bind_front_handler(&session::on_write, shared_from_this()));

    // 释放缓冲区中已处理的数据
    buffer_.consume(bytes_transferred);
}

客户端验证补充建议

在客户端的on_read回调里也添加消息打印,确认收到服务端的回显:

void on_read(beast::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);
    if (ec == websocket::error::closed) return;
    if (ec) fail(ec, "read");

    std::string echo_msg = beast::buffers_to_string(buffer_.data());
    std::cout << "收到服务端回显: " << echo_msg << std::endl;
    buffer_.consume(bytes_transferred);
}

现在重新运行你的测试命令:

server.exe 127.0.0.1 4242 1
client.exe 127.0.0.1 4242 "Hello"

服务端控制台应该会打印出收到客户端消息: Hello,客户端也会收到回显,这样就能验证功能正常了。

内容的提问来源于stack exchange,提问作者Morse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:15:55