即使与 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)一直存在?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Android中创建使Xmpp与XMPP服务器保持连接的服务?