如何通过websockets以两种方式读取和写入数据?



我目前正在尝试从websocket读取数据,它需要用户输入。同时,我也写入数据到websocket。当我只向websocket写入数据时,它曾经工作过。然而,当我试图读写websocket时,程序似乎停止了。下面是我试过的代码。

if(!messageQ.empty())
{   
//if (recvbuf.ch_idx == 1)
//cout << "Ws Write " << gs32cnt1 << endl;  
boost::beast::flat_buffer buffer;
ws_.write(net::buffer(*messageQ.front()));
ws_.read(buffer);
cout << "ws Read " << endl; 
auto out = boost::beast::buffers_to_string(buffer.cdata());
string stringVal;
stringVal = out;
std::cout<<"stringVal = "<<stringVal<<std::endl;
//printf("BAAAM! %dn", m_count_objects);
messageQ.pop_back();

正如你所看到的,我在'write'方法之后调用'read'方法。这似乎已经不对了。有什么websocket大师能帮帮我吗?提前感谢!

您可以使用异步版本。这个网站上有很多例子:

  • 如何用boost::beast或boost::asio异步写入内容到文件?
  • 一个非常复杂的例子显示如何谈论Chrome DevTools协议Chrome DevTools协议使用Boost Beast

在您的特定代码片段中,没有简单的转换是有用的,例如

struct X {
void foo() {
if (!messageQ.empty()) {
auto w = ws_.async_write(net::buffer(messageQ.front()), net::use_future);
boost::beast::flat_buffer buffer;
auto r = ws_.async_read(buffer, net::use_future);
r.wait();
std::cout << "stringVal = " << beast::buffers_to_string(buffer.cdata()) << std::endl;
// printf("BAAAM! %dn", m_count_objects);
w.wait();
messageQ.pop_back();
}
}
// std::deque<http::request<http::string_body>> messageQ;
std::deque<std::string>        messageQ;
net::thread_pool               ioc_{1};
websocket::stream<tcp::socket> ws_{ioc_};
~X() { ioc_.join(); }
};

你真正需要的是通常的模式

最佳实践"方法将始终保持异步读挂起,以便及早检测断开连接。这需要您回到异步执行所有IO。">

这是从另一个答案中引用的,我在BitMex客户端上展示了:Boost Beast, Handshake, Keep-Alive

注意,这是在用纯同步代码发布答案之后,有一些限制。你可能也有类似的情况,所以也许阅读这个答案会对你有所帮助。

最新更新