根据我的理解,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术语中,这些将被称为进程,但它们不是受保护的内存地址空间,它们是轻量级的用户空间线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top