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
相关产品推荐
相关产品推荐

