研究XMPP应用程序的线程实现有哪些好的资源?
-
01-07-2019 - |
题
根据我的理解,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
此方法应与基于事件或拉解析器一起使用。它只需要保持一个指针状态。显然,你还需要处理属性,字符数据,实体引用(如& amp;等),以及特殊用途的stream:stream标签,但这应该让你开始。
其他提示
Igniterealtime.org提供了一个用java编写的开源XMPP服务器和客户端
ejabberd 是用Erlang编写的。我不知道ejabberd实现的细节,但使用Erlang的一个优点是非常便宜的线程。我推测他们每个XMPP连接都会启动一个线程。在Erlang术语中,这些将被称为进程,但它们不是受保护的内存地址空间,它们是轻量级的用户空间线程。
不隶属于 StackOverflow