有什么好的资料可以研究XMPP应用程序的线程实现?
时间:2020-03-06 14:28:52 来源:igfitidea点击:
据我了解,XMPP协议基于永远在线的连接,在该连接中我们没有即时的XML消息结束指示。
这意味着我们必须对流进行评估。这也意味着,可能必须处理异步连接,因为套接字可能会由于消息长度或者连接速度太慢而阻塞在XML消息的中间。
我希望每个答案都有一个资料来源,因此我们可以对其进行修改,然后看看最喜欢什么。
解决方案
Igniterealtime.org提供了一个用Java编写的开源XMPP服务器和客户端
ejabberd用Erlang编写。我不知道ejabberd实现的细节,但是使用Erlang的优点之一是真正便宜的线程。我推测它们会为每个XMPP连接启动一个线程。用Erlang术语将其称为进程,但它们不是受保护的内存地址空间,它们是轻量级的用户空间线程。
我们想一次处理多个连接吗?在这种情况下,必须进行良好的异步套接字处理,以避免每个连接占用一个线程。
否则,我们只需要一个XML解析器即可一次处理大量字节。外派是典型的例子。如果我们使用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标记,但这应该可以入门。