【问题标题】:Boost::Beast Websocket Bidirection Stream (C++)Boost::Beast Websocket 双向流 (C++)
【发布时间】:2018-11-28 13:27:21
【问题描述】:

我正在研究使用 Boost::Beast websocket 库来创建异步双向管道以在服务器和客户端之间传递数据。我利用了异步示例中的一些代码(如有必要,我可以稍后发布一些代码,现在无法访问它)。我目前有一个类,它创建了几个运行 SocketListener 的线程。当客户端连接时,它会创建一个 Session shared_ptr 来执行异步读写功能。问题是,这个会话对象只会在客户端向我发送消息时写出来。我正在寻找一种实现,它允许我的服务器按需写入​​连接到它的所有客户端,并监听来自这些连接的传入数据。

这可能吗?我为此使用了错误的技术吗?我认为这可能实现的另一种方法是拥有一个传入的 websocket 和传出的 websocket。传入将允许客户端删除服务器的配置,传出将仅监视消息队列并在消息可用时执行异步写入。

谢谢!

【问题讨论】:

    标签: c++ websocket beast


    【解决方案1】:

    这可能吗?

    是的

    我是否使用了错误的技术?

    没有

    我认为这可能实现的另一种方法是有一个传入的 websocket 和一个传出的 websocket,分别为否。

    没必要,websocket 流是全双工的。可以同时读写。

    outgoing 只会监控一个消息队列并在消息可用时进行异步写入。

    这是正确的方法,但您可以在处理读取的同一个 Session 对象中执行此操作。

    下面是一个连续读取也可以全双工写入的例子:https://github.com/vinniefalco/CppCon2018

    【讨论】:

    • 嘿维尼,感谢您的回复!我正在查看您的示例,并且可能由于我对 boost::asio 的专业知识不足,我不确定一旦您将会话升级到 websocket,我将如何将服务器置于全双工状态。 websocket::on_accept 是您进入异步 on_read 的入口,然后它会查看您是否有要发送的消息。但这需要客户发送正确的东西吗?我们可以告诉 websocket 写入而不需要它先读取它吗?再次感谢。图书馆很棒:)
    • 是的,你可以独立发起读写。我上面链接的示例就是这样做的。您不会将服务器“放置”为全双工模式,您只需根据需要发出读取和写入。它的工作方式与普通套接字相同。
    • 谢谢。我已经启动并运行,它似乎正在飞行并支持多个套接字连接。共享状态无疑有助于促进 WS 操作。我不得不使用sync_write而不是async_write,因为看起来我打得太快了,而且它们被同时调用了。您是否发现混合使用 sync_writes 和 async_reads 存在问题?
    • 您应该坚持同步或异步操作。您一次只能有一个呼叫async_write 待处理。如果您想在当前消息完成写入之前发送下一条消息,那么您必须实现自己的队列。这在此处演示:github.com/vinniefalco/CppCon2018/blob/…
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2018-11-26
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多