即使与 XMPP 服务器断开连接,如何保持群聊室(MUC)一直存在?

Posted

技术标签:

【中文标题】即使与 XMPP 服务器断开连接,如何保持群聊室(MUC)一直存在?【英文标题】:How to keep the groupchat room (MUC) existing all the time even if disconnected from the XMPP server? 【发布时间】:2013-12-11 03:11:46 【问题描述】:

我正在使用 XMPP (Jabber) 协议中的 openfire/jsjac 开发即时消息模块(J2EE Web 应用程序的一部分)。

openfire 用户/组管理/表已重定向到我们的业务数据库表,这意味着我不再需要在 openfire 中维护用户/组。业务数据库中已设置所有用户/组关系。

下面是我根据要求绘制的关于主窗格的图像。 由于我的声誉低下,我无法发布图片,因此我发布了即时消息主 UI 的图片的网址。很抱歉给您带来不便。 instantmessage main UI Image

你们可以看到,在左侧窗格中,没有用户/组列表。有根据历史记录保存的会话,这让我很困惑,特别是关于组。 我从 XMPP.org 阅读了“XEP-0045:多用户聊天”。我了解有关群聊的一般工作流程: XEP-0045: Multi-User Chat"

    创建房间,生成房间Jid。 配置房间。(预留房间) 从业务数据库中获取 usersjid 并将用户绑定(添加)到新创建的房间。 向房间发送消息。 服务将向所有组成员发送消息。

并且知道有房间类型是persistent room解释为“如果最后一个住户退出也不会被破坏的房间;反义词:Temporary Room.”由文档。 在同一个文档中有一些句子说:

房间所有者必须能够销毁房间,特别是如果房间是持久的。工作流程如下:

    房间所有者请求销毁房间,可选择指定原因和备用地点。 房间会从房间中移除所有用户(包括有关备用位置和被移除原因的适当信息)并销毁房间,即使它被定义为持久性也是如此。

看了上面那句话,我比较疑惑,还有几个问题我还是一头雾水。

    “乘员出口”是什么意思?如果住户从系统中注销(离线),是否意味着“存在”。并且所有住户都处于离线状态,这是否意味着“持久类型”将使我们创建的房间保持存在?那么房间信息保存在哪里呢?在 openfire 或其他地方? 假设所有住户都存在(离线),虽然这个创建的房间没有被破坏,那么绑定信息呢?我的意思是假设一个用户被所有者(管理员)授予会员资格,如果这个用户存在或离线,持久房间将保留他的会员角色,对吗?也就是说,只要房间没有被破坏,所有的配置和绑定信息都不会丢失,对吧? openfire服务器遇到重启的情况,创建的房间及其信息是否还在? 如果主人重新登录,如何重新找到创建的房间?通过保存房间 ID?

除了上面的问题,我想到了实现具有持久房间的 MUC 的工作流程。请您检查一下,看看流程中存在什么问题?

我的 MUC 工作流程与持久空间

    所有者将出席对象发送到服务器以创建房间并提供房间 JID,并设置房间 ID。 业主发送IQ对象到服务器配置创建的房间,并设置房间类型为“持久”。 所有者发送 IQ 对象以授予其他用户成员角色。(绑定信息) 所有者向ROOM jid发送消息Object,ROOM jid会将所有消息转发给其绑定的成员。 这个房间的普通成员处理message(receive)并获取房间jid和房间id (希望包括所有者在内的所有用户都可以使用这个房间id重新找到房间他们重新登录..)

那么无论是什么角色,所有者还是普通成员,在房间类型为“persistent”的前提下,如何根据房间jid或房间id重新找到并重新加入创建的房间??强>

【问题讨论】:

【参考方案1】:

    规范说“必须能够销毁”,而不是“必须销毁”。持久性 MUC不会在最后一个用户离开 MUC 时自动销毁

    我依赖于 MUC 组件的实现。如果它将持久 MUC 存储在持久存储上,那么它能够在重新启动时重新加载所有持久 MUC。 IIRC Openfire 的 MUC 组件就是这样做的。

    使其持久化。

【讨论】:

4.如果所有者重新登录,如何重新找到创建的房间?通过保存房间ID?【参考方案2】:

您需要更新openfire中的java代码,这样如果用户离线,组不会被删除。您需要在openfire中针对MUC更新代码

【讨论】:

能否请您帮我提供 Openfire 中 MUC 的代码。提前致谢!【参考方案3】:

我建议你看看 MUCLight 的新 XMPP 功能。

它具有多种功能,但并非所有功能都像 whatsapp 和您所期望的那样。

在这个 MUCLight 组类型中处理持久性。

MongooseIM 服务器上的 XMPP :https://mongooseim.readthedocs.io/en/latest/open-extensions/muc_light/

XMPP over Ejabberd 服务器 : https://www.ejabberd.im/aggregator/categories/2

【讨论】:

以上是关于即使与 XMPP 服务器断开连接,如何保持群聊室(MUC)一直存在?的主要内容,如果未能解决你的问题,请参考以下文章

使用openfire在xmpp中几秒钟后连接断开

PHP:保持与 XMPP 聊天客户端的持久连接

如何在Android中创建使Xmpp与XMPP服务器保持连接的服务?

xmpp服务器的客户端可以断开其他客户端与服务器的连接吗?

XMPP 注销(Smack API),无需断开与服务器的连接

从 ios 和 android 端连接到 xmpp 时获取所有组消息