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

2024-04-25

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

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

下面是我根据要求绘制的主窗格图像。 由于我的声誉较低,我无法发布图像,因此我发布了即时消息主 UI 图像的 url。很抱歉给您带来不便。即时消息主 UI 图像 http://xiangce.baidu.com/picture/detail/8f8d8e4830294a86cba3fb4f71137ff9bb631b8d

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

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

并得知有房型是持久的房间解释为“如果最后一个居住者退出,房间不会被摧毁;反义词:临时房间。“由医生。 在同一篇文档中,有一些句子:

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

  1. 房间主人要求销毁房间,并可选择指定原因和备用地点。
  2. 该房间会从房间中删除所有用户(包括有关备用位置和删除原因的适当信息)并销毁该房间,即使它被定义为持久房间。

看完上面这句话,我更加疑惑了,有几个问题我还是很困惑。

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

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

我的具有持久空间的 MUC 工作流程

  1. 所有者发送状态对象到服务器来创建房间并赋予房间JID,并设置房间ID。
  2. 所有者将 IQ 对象发送到服务器以配置创建的房间并将房间类型设置为“持久”。
  3. 所有者发送 IQ 对象来授予其他用户成员角色。(绑定信息)
  4. 所有者将消息Object发送给ROOM jid,ROOM jid会将所有消息转发给其绑定的成员。
  5. 该房间的普通成员处理消息(接收)并获取房间 jid 和room id (我希望包括业主在内的所有用户重新登录时都可以使用这个房间ID重新找到房间..)

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


  1. 规范说“必须能够摧毁”,而不是“必须摧毁”。持久性MUCdo not当最后一个用户离开 MUC 时自动销毁

  2. I 取决于 MUC 组件的实现。如果它将持久性 MUC 存储在持久性存储上,则它能够在重新启动时重新加载所有持久性 MUC。 IIRC Openfire 的 MUC 组件就是这样做的。

  3. 让它持久。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使与XMPP服务器断开连接,如何保持群聊室(MUC)始终存在? 的相关文章

  • xmpp框架iOS新用户注册方法

    我已经开发了适用于 iOS 的 XMPP 聊天客户端 现在我正在研究如何从 iOS 本身进行新用户注册 任何人都可以帮助注册新用户的方法 因为它需要与服务器通信并将用户名和密码存储到服务器数据库中 请帮帮我 我已经搜索了两天了 NSMuta
  • Openfire Android PubSub 订阅请求批准

    我是 Openfire 的新手 因此我对 pubsub 功能有疑问 实际上 我已经创建了一个节点设置访问模型 as 授权 如下所示 PubSubManager mgr new PubSubManager xmpp getConnection
  • XMPP 使用哪个端口?

    我搜索过但没有找到 XMPP 使用哪些端口 我需要实现XMPP服务器和客户端并使用XML传输 文件传输和流媒体 他们使用不同的端口吗 有没有办法让它们都一样使用 这样我就不需要打扰网络管理员 谢谢 根据维基百科 http en wikipe
  • Strope字符编码问题

    我正在开发 XMPP 客户端 并且在发送 接收消息时遇到问题Strophe http strophe im JavaScript 版本 问题是包含 特殊 字符的消息 例如 如果我发送 我在这 外部客户端 即 iChat 将显示 我在这儿 s
  • 基于 XMPP 协议的 Google Cloud Messaging(使用 PHP 和 XMPPHP 的服务器)。它是如何工作的?

    也许你已经听说过它 它是在一个月前的 Google IO 上宣布的 Google Cloud Messaging 仅位于下游 服务器 gt 电话 但现在通过增强的 CCS 云连接服务器 您可以通过持久 TCP 连接向上游发送消息 这要归功于
  • 为什么openfire的用户在会话中不存在SESSION的情况下仍保持在线

    I m developing an android app contains Messaging using OpenFire as an XMPP server and using Smack for android client All
  • XMPP BOSH 与 COMET

    我想编写一个实时聊天应用程序 并且需要决定使用哪些技术 这些技术之间有什么区别 您更喜欢哪一种 为什么 WebSockets 不是一个选择 因为它还没有准备好在野外战斗 Thanks 你应该阅读这个问题 为什么 BOSH 没有更受欢迎 尤其
  • 如何创建一个不由轮询驱动的聊天服务器?

    我创建了一个由客户端轮询驱动的简单聊天服务器 客户端每隔几秒发送一次数据请求 并收到任何新消息以及有关其对等方是否仍处于连接状态的信息 由于客户端在移动平台 iPhone 上运行 我一直在寻找摆脱轮询的方法 因为轮询会很快耗尽电池 我读到可
  • 如何使用 PHP 和 JQuery 开发基于 Web 的 XMPP 聊天工具?

    我正在寻求开发一个网站 该网站具有网站访问者和网站管理员之间的聊天功能 我知道最好的方法是使用 XMPP 但我没有使用它的经验 我希望使用 PHP 来实现这一点 我已经下载了 XMPPHP 并编辑了一个示例来向 GMail 中的 Googl
  • 无法与 aSmack 4.0.2 建立新连接

    我正在学习 Android 编程 这几天我一直在努力解决这个问题 我正在编写一个应该连接到 XMPP 服务器的 Android 应用程序 我总是遇到同样的错误 并且真的不知道我做错了什么 我尝试过通过谷歌找到的示例代码 但也无法与它们建立连
  • OpenFire - 使用 PubSub 的永久群聊

    首先从这个问题 Smack openfire 如何让用户永久留在群聊室 https stackoverflow com questions 19653877 asmack openfire how do i keep a user perm
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • 在 XMPP 中交换自定义 XML 元素的最佳方式?

    我有一个 XMPP 应用程序 其中两个客户端进行交互 1 一个机器人编程Smack http www igniterealtime org projects smack Scala Java 和 2 一个 GUI 聊天客户端strophe
  • XMPP 服务器的 libxml2 与 expat

    我正在尝试从头开始创建一个 XMPP 库 以及后来的服务器 Go http golang org 尽管语言本身无关紧要 作为学习 XMPP 协议和服务器软件开发一般知识的一种手段 正如许多人所知 XMPP 是基于 XML 的消息传递协议 它
  • 如何使用 Smack 通过 XMPP 设置/获取配置文件数据

    我正在 Android 上使用 Smack 库开发 XMPP 客户端 花名册 消息 状态等内容运行得很好 然而 我没有找到一种方法来存储额外的个人资料信息 用户图片 狗的名字 我从谷歌搜索中看到的唯一方法是使用 VCard 但它根本不起作用
  • 即使与XMPP服务器断开连接,如何保持群聊室(MUC)始终存在?

    我正在 XMPP Jabber 协议中使用 openfire jsjac 开发即时消息模块 J2EE Web 应用程序的一部分 openfire用户 组管理 表已重定向到我们的业务数据库表 这意味着我不再需要在openfire中维护用户 组
  • 如何在smack中设置我的名字?

    我可以使用 connection getRoster getName 来获取联系人的名册名称 但如何set当前经过身份验证的帐户的名称 使用不同的帐户登录 说真的 你的帐户名与你的身份验证绑定在一起 没有办法强迫对方为你使用特定的昵称 但如
  • 无法向 openfire 服务器发送消息

    我无法使用 SMACK API 向 openfire 服务器上的 XMPP 客户端发送消息 我不确定我哪里出错了 我在 gtalk 上测试了相同的代码 它工作正常 public class SenderTest public static
  • 适用于服务器端的良好 XMPP Java 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望用 Java 实现一个简单的 XMPP 服务器 我需要的是一个可以解析和理解来自客户端的 xmpp 请求的库 我看过 Smack 下
  • 从 ios 和 android 端连接到 xmpp 时获取所有群组消息

    我在用开放火版本 4 0 1 使用开火Rest Api https github com gidkom php openfire restapi我在服务 servicename xx xx xxx xxx 中创建了群聊室 现在房间已创建 发

随机推荐

  • 刷新div(导致浏览重绘它)

    在 Web 应用程序中 我在动态内容方面遇到了一些麻烦 在 jQuery UI 选项卡控件上方隐藏或显示的表单会导致呈现问题 直到用户将鼠标悬停在选项卡上 然后导致选项卡标题重新绘制正确的位置 它只发生在 IE7 中 作为一个快速破解 我在
  • Mongoose 多更新

    我想用不同的值更新多个文档 我的数据库看起来像这样 id 1 value 50 id 2 value 100 此查询返回错误 因为我传递的是数组而不是 set 中的对象 Model update id in ids set ids valu
  • 为什么 doctype 不自动关闭

    提供了一个 xhtml 文档类型 例如 为什么这个标签本身允许非自关闭 根本不关闭 Aka为什么不是 它不是一个标签 元素 这是一个声明 这就是声明的语法 文档类型声明 http www w3 org TR REC xml sec prol
  • 反应导航选项中“lazyLoad”和“lazy”之间的区别

    我在选项卡更改上重新渲染组件时遇到问题 并且显然添加lazyLoad true导航选项解决了它 但我不太明白它是如何工作的 特别是在那之前 我遇到了另一个问题并添加lazy true选项解决了它 所以我的问题是 两者之间有什么区别以及它们在
  • 更改grep命令的分隔符

    我在用grep检测 a href xxxx something here a 当链接在输入中分成两行时 这不起作用 我想 grep 检查直到它检测到但现在它只是将输入输入到 grep 中 直到检测到新行为止 所以如果输入是这样的 a hre
  • 通过模板参数中的 SFINAE 选择构造函数

    我试图通过 SFINAE 选择一个构造函数 如下所示 template
  • 您可以使用 CASE WHEN THEN 别名进行 GROUP BY 吗?

    我有一个从别名为 Length 的 CASE WHEN THEN 状态 或者可以使用多个 IF 语句 计算的 SELECT 语句 并且我需要将结果正确地分组在一起 SELECT 似乎有效 但该小组将它们分组错误 这是我的声明 SELECT
  • SQL Developer 中查询的快捷方式

    我的同事使用 TOAD 有一个很好的功能 即查询快捷方式 例如 他们编写 get customer info 并且该单词被完整连接查询替换 这个功能对于提高生产力非常有用 我的机器未获得 Toad 许可 并且我使用 Oracle SQL D
  • 如何从 Linux 和 Solaris 上的挂载中提取 NFS 信息?

    我需要使用提取 NFS 挂载信息mount在 Linux RHEL 4 5 和 Solaris Solaris 10 系统上 由于这是 SSH 命令的一部分 因此提取需要在一行中进行 不幸的是 Linux 和 Solaris 在该行的不同部
  • 如何在南迁中访问 auth User 的 User.objects.create_user(...) ?

    我没有使用 django 的 auth 模块 而是使用了自己的模块 并且已经非常后悔了 为了纠正这种情况 我正在尝试将数据从我的用户模型迁移到 django auth models User 我创建了一个数据迁移 如下所示 def forw
  • WPF C# - 计时器倒计时

    如何在用 WPF C 编写的代码中实现以下内容 我有一个 ElementFlow 控件 在其中实现了 SelectionChanged 事件 该事件 根据定义 在控件的项目选择发生更改时触发特定事件 我想要它做的是 启动计时器 如果计时器达
  • 尽管我可以使用 Visual Studio 检查它,但 selenium Web 元素上的文本属性为空

    在没有发布 C 代码和标记页面的情况下 是否有人知道此代码的原因 var link driver FindElement By Id field Field var id link GetAttribute id var text link
  • 如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?

    我将ojdbc6 jar复制到tomcat安装文件夹中的lib文件夹中 当我部署在 JDBC 连接中使用 Oracle 驱动程序的 Web 应用程序时 服务器说找不到驱动程序类 我被迫手动执行 DriverManager registerD
  • 如何在终端中显示图像?

    是否有任何类型的实用程序可以用来将图像转换为 ASCII 然后在我的终端中打印 我寻找过 但似乎没有找到 一个名为cacaview http linux die net man 1 cacaview允许您执行此操作 它是交互式的 允许您平移
  • Delphi - 列表索引越界(4)

    我知道这个问题已经被提出了一百万次 但是 我无法理解为什么这段代码会抛出错误 我已经找到了导致错误的罪魁祸首 FOR 循环 但是 我没有看到它有任何问题 我收到错误 列表索引超出范围 4 function TNetwork FeedForw
  • 如何消除autocrlf造成的损害?

    我已经使用 git 并将 autocrlf 设置为 true 一段时间了 我一直通过 cygwin 与 git svn 一起使用它 这给我带来了很多问题 我明白了here https stackoverflow com questions
  • Hilt Fragments 必须附加到 @AndroidEntryPoint Activity。找到:类 androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity

    当我运行单元测试代码时出现以下错误 Caused by java lang IllegalStateException Hilt Fragments must be attached to an AndroidEntryPoint Acti
  • location.href = location.href 不会重定向

    在我的 javascript 代码中 在某些时候 我需要刷新窗口 用户已上传新图像 但在页面中仍然可以看到它 我想知道为什么 location href location href 不刷新窗口 要刷新窗口 请尝试 window locati
  • 如何“使用 Logger API 将日志添加到您的项目”? (谷歌脚本)

    我正在尝试查看脚本的输出 但是当我转到 查看日志 时 我收到一条警报 未找到日志 使用 Logger API 将日志添加到您的项目中 如何添加记录器 API 您需要添加到您的代码中 Logger log Yes this was logge
  • 即使与XMPP服务器断开连接,如何保持群聊室(MUC)始终存在?

    我正在 XMPP Jabber 协议中使用 openfire jsjac 开发即时消息模块 J2EE Web 应用程序的一部分 openfire用户 组管理 表已重定向到我们的业务数据库表 这意味着我不再需要在openfire中维护用户 组