【问题标题】:Websocket and reception of a messageWebsocket和消息的接收
【发布时间】:2013-06-04 12:26:40
【问题描述】:

我尝试在 boost 下通过 websocket 制作服务器“消息”。 目前,我经常可以从服务器发送大量消息或一系列消息。 当我点击“发送”时,它会发送大量数据。 困难在于,当服务器在 websocket 消息中接收到诸如“停止”、“暂停”之类的命令时,该命令会一直运行到上一条消息结束。我尝试停止执行上一个命令。

我尝试在发送数据之间读取缓冲区。但它不起作用。我尝试检查是否有一个接收带有 async_read_some 的订单。

我基于的例子 http://www.codeproject.com/Articles/443660/Building-a-basic-HTML5-client-server-application 和 HTTP 服务器提升 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html

你有什么想法吗?我多次修改了我的代码,但我无法执行新的实时控件,因为它出现在最后..

谢谢

【问题讨论】:

  • 我找到了一个解决方案,即在每次分析新缓冲区时启动的线程中创建一个函数。

标签: c++ boost websocket boost-asio


【解决方案1】:

如果数据已经发送到网络适配器,您几乎无法更改数据包的顺序。网络适​​配器将在数据包到达时发送数据包,按照您将它们排队的顺序。

如果您希望能够发送“更高优先级”的消息,那么不要一次性发送所有数据,而是将其放在队列中等待设备接受更多数据,如果高优先级消息进来,在你发送任何其他数据包之前发送它。

不要让数据包太小,但我想如果你一次制作几千字节左右的数据包,它会很快工作并且仍然可以很好地控制流量。

当然,这也需要接收方理解“信息可能有不同的‘流’或‘流’,如果你发送‘暂停’命令,就意味着之前发送的流是在发送'resume'之前不会收到任何东西”显然根据您需要的行为进行调整,但您确实需要一些方法来不仅仅是说“将'STOP'作为数据放入流程的其余部分”,而是解释它作为一个命令。

【讨论】:

  • 谢谢。我的方法与您提供的方法相似。目前,我通过消息将我的数据分成几部分。我尝试在每次发送消息之间都没有成功,以测试我是否有类似“停止”的消息来启动一个函数以完成发送剩余的数据片段我尝试执行捕获缓冲区并读取以查看是否有同时收到一条新消息。这是行不通的。但是,以下命令已收到但已到达 一方面我收到包含命令的消息,另一方面,我运行这些命令并通过消息发送答案。
【解决方案2】:

如果您在服务器收到所有数据时将大型消息作为单个数据包发送到网络中,服务器收到停止消息时您可能无法控制它,直到您完成接收数据。

最好实现优先级消息队列。从客户端发送消息作为小块并组装服务器而不是单个大数据包。给予像停止(取消)高优先级的消息包。在服务器端接收消息时,如果存在诸如停止(取消)之类的高优先级消息,则不需要接受剩余消息,您可以在服务器端关闭 websocket 连接。

阅读主题Chunking WebSocket Transmission 了解更多信息。

【讨论】:

  • 您好,谢谢。我的代码考虑了消息的大小和优先级,但问题是我无法在两个程序之间捕获新消息。每次回执,它都会检查收到的消息并确定消息中的命令(和功能),但在“发送”期间,而不是它是否收到新消息。
【解决方案3】:

在您使用 Boost 时,您是否看过 WebSocket++(基于 Boost/ASIO)?

【讨论】:

  • 您好,我想随后使用 websocket ++,但这需要我更多时间,我不确定它是否对我有帮助。后来我用线程找到了解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2022-11-10
  • 2020-01-02
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多