据我了解,XMPP 协议基于始终在线的连接,您无法立即指示 XML 消息何时结束。
这意味着您必须在流来时对其进行评估。这也意味着,您可能必须处理异步连接,因为套接字可能会阻塞在 XML 消息的中间,原因可能是消息长度或连接速度慢。
我会很感激每个答案的一个来源,这样我们就可以修改它们,看看最喜欢的是什么。
据我了解,XMPP 协议基于始终在线的连接,您无法立即指示 XML 消息何时结束。
这意味着您必须在流来时对其进行评估。这也意味着,您可能必须处理异步连接,因为套接字可能会阻塞在 XML 消息的中间,原因可能是消息长度或连接速度慢。
我会很感激每个答案的一个来源,这样我们就可以修改它们,看看最喜欢的是什么。
您想一次处理多个连接吗?在这种情况下,良好的异步套接字处理是必须的,以避免每个连接一个线程。
否则,您只需要一个可以一次处理一大块字节的 XML 解析器。 Expat是典型的例子;如果您使用 Java,请尝试XP。这些类型的 XML 解析器将尽可能触发事件,并缓冲部分节,直到其余节到达。
现在,为了解决您关于节结束时没有通知的断言,这不是真的。重要的是不要将 XML 流当作文档序列来处理。使用以下伪代码:
stanza = null
while parser has more:
switch on token type:
START_TAG:
elem = create element from parser state
if stanza is not null:
add elem as child of stanza
stanza = elem
END_TAG:
parent = parent of stanza
if parent is not null:
fire OnStanza event
stanza = parent
这种方法应该适用于基于事件的解析器或拉式解析器。它只需要保持一个指针的状态。显然,您还需要处理属性、字符数据、实体引用(如 & 等)和特殊用途的 stream:stream 标记,但这应该可以帮助您入门。
Igniterealtime.org 提供了一个用 java 编写的开源 XMPP 服务器和客户端
ejabberd是用 Erlang 编写的。我不知道 ejabberd 实现的细节,但使用 Erlang 的一个优点是线程非常便宜。我推测他们会为每个 XMPP 连接启动一个线程。在 Erlang 术语中,这些被称为进程,但它们不是受保护的内存地址空间,它们是轻量级的用户空间线程。