让我用一个例子来详细解释一下(sn-ps取自here)。
您不会成功地考虑收到的 XML,例如
一个文件,这是您的 Unexpected end of file has occurred 错误
来自。您必须逐步解析 XML。
当您连接到 XMPP 时,您会打开与服务器的连接。为此,您发送如下内容...
<stream:stream
to='example.com'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
version='1.0'>
...让我们暂时忽略身份验证并假设它有效。您会注意到仅这一节不是有效的 XML(元素未关闭)。但是,对于 XMPP,没关系。服务器将发回它自己的消息,告诉您一切顺利。现在我们知道我们可以发送我们的消息节了。我们输入消息,然后发送...
<message from='juliet@example.com' to='romeo@example.net'>
<body>Romeo, romeo...</body>
</message>
几秒钟后,我们决定下线...
<presence type='unavailable'/>
</stream:stream>
现在让我们看看我们发送了什么......
<stream:stream
to='example.com'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
version='1.0'>
<!-- A few seconds elapsed -->
<message from='juliet@example.com' to='romeo@example.net'>
<body>Romeo, romeo...</body>
</message>
<!-- A few seconds elapsed -->
<presence type='unavailable'/>
</stream:stream>
因此,最终,您可以将与服务器的交互视为您正在创建一个最终成为完全有效的 XML 文档的文档。当您第一次学习 XMPP 时,这是一种很好的思考方式。
但是,您是在一段时间内创建此文档,而不是一次全部创建。 XML 库通常不会认为您现在只创建文档的一部分:它们关注的是一次创建整个文档。这就是为什么传统的 XML 库可能对您编写 XMPP 程序没有帮助的原因。此外,一个简单的 XML 库将无法处理额外的信息,例如身份验证逻辑。
最后,您可以编写自己的库。但是,您在选择工具时需要非常小心(正如我之前所说,XML 库可能无法处理这些部分 XML 创建)。
不管怎样,最后,你的问题是……
How can I send not closed pice of xml?
答案是:找一个图书馆为你做这件事。而且我不仅仅指 XML 部分:我指的是所有 XMPP。正确的库甚至不需要您关心 XML 甚至存在的事实,除非您真的很先进。如果你找不到图书馆...
- 仔细观察。花一天时间寻找图书馆仍然比自己制作一个月的时间要少。
- 看看你是否能找到一个开源库来满足你的大部分需求。然后,解决不同的部分,或者自己更改源代码以填补空白。