multithreading - 研究 XMPP 应用程序的线程实现的好资源是什么?

标签 multithreading networking xmpp

据我了解,XMPP 协议(protocol)基于始终在线的连接,您无法立即指示 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 标记,但这应该可以帮助您入门。

关于multithreading - 研究 XMPP 应用程序的线程实现的好资源是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/107772/

相关文章:

sockets - 如何使用TCP连接在Go(golang)中编写代理

networking - 无需虚拟 PC 即可访问网络的 Pocket PC 模拟器?

linux - 网络中需要原始套接字

android - 通过Gradle从Maven下载smack4.1失败

ios - 无法使用用户名和密码登录以在 Xmpp 中聊天

java - 委托(delegate)给线程,同时保持线性可读性

java - 正确使用同步单例?

c++ - Facebook folly::AccessSpreader 是如何工作的?

XMPP 多人游戏 : should I store opponents as roster contacts?

c# - Form.Show()导致Visual Studio 2010中的InvalidOperationException,该异常在2008年不存在