【问题标题】:Simplest way to continously send XML data in QTcpSocket在 QTcpSocket 中连续发送 XML 数据的最简单方法
【发布时间】:2016-05-02 12:50:26
【问题描述】:

我必须将 xml 数据从我的电脑连续发送到我的平板电脑。 (两者都在运行窗口)

我的平板电脑应该会收到完整的 xml 文件并实时显示。

xml 文件是由每次发送的通知消息组成的。 它的类型:

<notification>
<id>1</id>
<message>hello world</message>
</notification>

使用 QTcpSocket 最简单的方法是什么?

【问题讨论】:

  • 您会将永无止境的流作为单个 XML 文档发送,还是将其作为连续的连接发送多个 XML 文档?
  • 除了我之前的查询,TCP 是一个 streaming 协议。流的开始是连接被接受时,连接关闭时结束。在这两者之间没有消息边界,它只是无穷无尽的数据流。
  • 这是 streaming 部分,因为它是流式传输的,所以没有消息边界。您必须使用自己的协议覆盖流,该协议要么包括特定边界,要么具有包含消息长度的标头。这就是我向您询问有关 XML 文档的原因。没有结尾的单个 XML 文档很难解析,但是如果您发送较小的 XML 文档,您的消息和消息边界位于 XML 文档的开头和结尾。不需要关闭消息之间的连接,让它们在流中流动即可。
  • AS Joachim 建议您简单地接受所有数据并不断解析它。假设您正在两个标签 和 消息结束> 之间查找数据,然后您将继续读取任何传入数据,直到看到第一个标签(我猜您会在此之前丢弃任何错误的数据) .然后当你得到开始标签时,打开你的文件并将所有数据存储到你的文件中,直到你读入结束标签,然后关闭你的文件并再次开始扫描开始标签......
  • 你的 cmets 很有用。你可以发布一个答案,这样我就可以投票并勾选它。

标签: c++ qt networking network-programming qtcpsocket


【解决方案1】:

您只需接受所有数据并不断解析它。

假设您正在寻找两个标签之间的数据:

<notification>
      :
    data 
      :
</notification>

然后您将执行以下操作:

  • 继续读取任何传入的数据,直到看到第一个标签(我猜你会丢弃之前的任何内容作为错误)。

  • 获得开始标签后,打开文件并开始将所有数据存储到文件中并开始扫描结束标签。

  • 当你读入结束标签,然后关闭文件并再次开始扫描开始标签(即回到开始状态)...

您只需要制作一个小型状态机(可能只需要一个具有两种状态的变量:SCANNING_FOR_STARTSTORING_DATA_AND_SCANNING_FOR_END)。

【讨论】:

  • 谢谢,+1。寻找答案。
猜你喜欢
  • 2011-10-11
  • 2011-10-10
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多