如何有效地定义基于 XML 的文本协议的传输结束?

2024-03-15

我想开发一个基于XML并通过TCP/IP套接字传输的文本协议。 假设我有一个简单的请求/响应机制,可以通过持久化发送 客户端和服务器之间的 TCP/IP 连接如下:

<?xml version="1.0" encoding="UTF-8"?>
<request id="1" command="get.answer">
    <value type="string">Answer to the Ultimate Question of Life, the Universe, and Everything</value>
</request>

<?xml version="1.0" encoding="UTF-8"?>
<response id="1" command="get.answer">
    <value type="int32">42</value>
</response>

各方应何时开始处理传入数据,或者换句话说 服务器什么时候知道传入的客户端数据已完全传输 并可以处理以创建响应?

当然,我对此主题做了一些研究: 我发现this https://stackoverflow.com/questions/6593969/simple-chat-protocol/6594192#6594192根据 HTTP 示例,答案指向正确的方向: 因此,在 XML 消息之上使用一种“传输协议”肯定会有所帮助。

但我也研究了纯粹基于 XML 的 XMPP 协议,它不使用任何 至少据我所知,“传输协议”类似于 HTTP。

RFC 6120 的“2.4. 结构化数据”中写道:

XMPP 中的基本协议数据单元不是 XML 流( 只是提供点对点通信的传输)但是 XML“节”,本质上是发送的 XML 片段 越过一条小溪。节的根元素包括路由 属性(例如“发件人”和“收件人”地址)和子项 该节的元素包含用于传递到预期目标的有效负载 接受者。

因此,他们通过 TCP/IP 发送基本上小的 XML 块,无需“传输协议”,并且从 我的wireshark跟踪我可以看到也没有特殊的传输结束字符 在每个 XML 节的末尾,例如两次 \r\n 或类似的内容。 那么他们如何知道消息(节)的结束呢?


实际上,XMPP 使用XML流 http://www.ietf.org/rfc/rfc3920.txt传输数据。您所指的数据单元是各个消息的实际交换,但它们都包含在定义 XMPP 会话通信的起点和终点的 XML 流中。

这将是传输结束发生的地方,就像所有传输结束一样。在该流中,有 3 种定义的数据包类型(IQ、消息和存在),它们指示各个消息(用于客户端到服务器通信)的开始和结束。

尽管基本情况是通过 TCP 连接完成的,但也有支持不同有线协议的扩展,例如HTTP http://xmpp.org/extensions/xep-0124.html这对于允许 XMPP 通过防火墙很有用。

如果您想做类似的事情,那么您可以遵循相同的方法,即在建立和断开连接时启动和结束 XML 流。然后,您只需定义各个消息类型,以便您的端点知道什么构成完整的消息。

或者您可以使用 XMPP,它似乎非常适合您的用例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地定义基于 XML 的文本协议的传输结束? 的相关文章

随机推荐