我正在开发一个使用 XMPP 协议的移动应用程序聊天,在成功实现一对一聊天之后,现在处于多用户聊天 (MUC) 阶段,由于有三种不同的 MUC 实现方法可用传统 MUC、Muclight、MUC Sub , 现在有很多问题
除了这个还有什么办法吗?
哪种方法最好实施?
不同方法的优缺点是什么?
哪种方法是最先进的?
哪种方法问题较少?
哪个最可靠?
我正在开发一个使用 XMPP 协议的移动应用程序聊天,在成功实现一对一聊天之后,现在处于多用户聊天 (MUC) 阶段,由于有三种不同的 MUC 实现方法可用传统 MUC、Muclight、MUC Sub , 现在有很多问题
除了这个还有什么办法吗?
哪种方法最好实施?
不同方法的优缺点是什么?
哪种方法是最先进的?
哪种方法问题较少?
哪个最可靠?
免责声明:我为开发 MongooseIM 和 MUC Light 的 Erlang Solutions 工作。
我将尝试逐点解决您的问题:
除了这个还有什么办法吗?
MIX是一种新的(与传统的 MUC 相比)基于PubSub的 XMPP 组通信/信令解决方案。我不知道有任何公开可用的实现,但 XSF 似乎达成了一些共识,使其成为传统 MUC 的正式继承者。
从实现者的角度来看,PubSub 可能是所有 XEP 中最长和最复杂的(XEP 是 XMPP 扩展协议,或者简单地说是附加的 XMPP 功能)。MIX 建立在 PubSub 之上,它又增加了一层。我没有使用 MIX 的实践经验,但从相关规范的数量猜测,这并不是最容易上手的解决方案。
同时,PubSub(因此是 MIX)对移动设备友好,即用户体验不会因频繁的连接中断而降低,不依赖状态更新,易于存档,因此多设备同步可能非常容易。
哪种方法是最先进的?哪种方法问题较少?不同方法的优缺点是什么?
传统的 MUC定义了用户在房间中可以扮演的一组丰富的角色(访客、参与者、主持人)、权限(用户可以做什么和不能做什么)和从属关系(用户可以加入某个房间吗?他/她是所有者?被踢/被禁止?)。它基于 IRC 频道的常规结构,但将概念标准化。该模型非常丰富,但同时可能有点过于复杂。传统的 MUC 严重依赖于客户端与服务器的持续连接 - 断开连接需要客户端应用程序显式重新加入它所在的任何房间。没有标准的方法来告诉用户是哪些房间的成员,所以这些信息必须存储在应用程序/设备中。
我不确定在房间/订阅模型方面传统 MUC 与 MIX 相比如何。
从官方文档来看,MUC/Sub是对传统 MUC 的扩展,保留了所有原始功能,并添加了类似 PubSub 的消息订阅选项,无需依赖状态交换和与服务器的持续连接。其他(大多数?全部?)交互也是可能的,同时交换存在节的必要性被取消。据我所知,它只在 ejabberd 中实现。
MUC Light(不要错过开发者指南了解一些额外的细节)采用不同的方法来启用移动设备的群组通信。它简化了传统的 MUC 角色/从属关系模型(这可能是好事也可能是坏事,取决于您的要求),不需要与服务器的持续连接和状态交换来加入/离开房间(这绝对有利于移动设备)并带有传统的 MUC 协议兼容层(尽管它还引入了一个新的、更简单的协议层)。在实施方面,MUC Light 房间应该比 MongooseIM 中的传统 MUC 房间更好地扩展,并且由于它们的设计更具容错性。
哪些方法最好实施?
让我们从可用的实现开始:
总而言之,什么是“最佳”实施取决于您的要求。如果您熟悉 PubSub 并将其用于其他情况,则 MIX 可能是要走的路(如果可以找到/开发合适的服务器范围的实现)。如果您需要丰富的聊天室模型和功能集,传统的 MUC 就可以完成这项工作,但让它在移动设备上运行会感觉很笨拙。MUC/Sub 可能会减轻这种感觉,但我不知道客户端库的可用性。MUC Light 非常简单,但在极少数情况下可能会受到限制。尽管如此,它可能是最容易开始使用的。
对于简单的群聊,您可以从Extended Stanza Addressing开始- openfire(开箱即用)、ejabberd(mod_multicast)和 prosody(mod_addressing)都支持它。使用扩展的节寻址,您可以像在电子邮件中一样将多个收件人添加到您的消息中。