在多用户聊天中向离线用户发送消息(ejabberd)

时间:2014-03-12 13:21:14

标签: xmpp chat ejabberd

实际上我们正在将ejabberd服务器用于我们客户的聊天应用程序之一。除了群聊之外,一切都很顺利。

我们正在使用MUC进行群组聊天,但只要用户离线,它就不会向会员发送消息。是否有任何替代插件或我们可以使其工作的东西?

或者任何人都可以建议如何从群聊历史中接收该用户的离线消息。

提前致谢

3 个答案:

答案 0 :(得分:13)

那是因为多用户聊天室没有这样的概念。事实上,如果你再多想一想,你就会理解为什么:

  • 在任何特定时间,可能会有一定数量的参与者出现在会议室中。

    如果服务器将消息存储在离线存储中,那么MUC房间中当前不存在的用户究竟是什么?我的意思是,在通用情况下,服务器并不知道所有可能在其托管的特定房间内聊天的用户。

    (好吧,如果这是唯一的问题,它可能适用于仅限会员的房间,我必须承认。)

  • MUC会议室不是“仅限本地服务器”:来自任意数量的其他服务器的潜在未绑定数量的用户可能会加入会议室,并且将通过各自的服务器路由这些用户的消息。< / p>

    显然,这是为什么“MUC房间离线存储”这样的想法毫无意义的另一个原因。

  • 根据定义,MUC房间是短暂的:当用户离线时,他们不在任何房间 - (重新)joninig房间是一个明确的行动。

    这实际上是不支持离线存储的最重要原因。

正如您所看到的,XMPP MUC房间很像IRC对类固醇的聊天。

所以你真正想要的是"room history" - XMPP-0045扩展的一部分,它允许客户明确地向房间询问他们错过的消息历史。在某种意义上,不是为每个用户存储离线消息,而是可以将房间配置为仅存储发送给它的一定数量的最新消息(或者在给定的时间段内存储所有这些消息)。然后,会议室支持由加入的用户查询这些消息。

您可以探索另一种可能性:XEP-0033 "multicast addressing"(“扩展节点寻址”)。基本上,它允许客户端使用特殊的多播服务一次将其消息发送给多个收件人。好处是离线存储再次存在。缺点是我怀疑在ejabberd中支持开箱即用的多播服务,似乎该扩展留下了很多关于如何实现未指定的细节。

答案 1 :(得分:3)

当我试图为我的聊天应用程序实现groupchats时,我遇到了你的问题。我遇到了MUC没有为每个收件人存储离线消息的相同问题。我不想检索MUC历史记录,这需要用户重新加入每个MUC来更新他的消息数据库。我想要的是服务器保存收件人的离线消息,并让收件人在上线时获取所有MUC消息(无需加入每个MUC)。

我这样做是通过pubsub。使用pubsub将强制服务器为每个收件人存储脱机消息。当用户重新连接时,他获取所有离线消息,包括作为普通消息发送的pubsub消息 - 就是这样。我在pubsub上对MUC的一个问题是,很难获得订阅者列表。因此,当我的应用程序创建群聊时,它会为消息创建一个pubsub节点,邀请所有参与者订阅(包括自我)到pubsub,我的应用程序也会创建一个MUC并使每个参与者成为该MUC的所有者。这样,可以通过检查MUC的所有者列表来检索群聊参与者的列表。 MUC的唯一目的是保存参与者列表以及群组聊天的名称。其他所有内容都由pubsub节点处理。

有什么不清楚请告诉我。

其他细节: 基本上当用户想要创建群聊时,我们的应用会创建一个pubsub节点以及一个MUC。您需要熟悉这两个概念。对于pubsub节点,您需要设置一个选项以允许任何订阅者发布。当用户发送消息时,他实际上是在节点上发布的,并且ejabberd会将消息发送给所有订阅者,就像它是常规消息一样(除了它来自pubsub.yourdomain.com)。因此,如果收件人处于脱机状态,ejabberd会将此邮件存储为任何其他常规邮件。

这不是ejabberd处理MUC消息的方式。这些只会发送给聊天室中的人们。然而,ejabberd可以存储消息历史,但是对于接收者来说,他需要加入MUC。这意味着每次应用重新连接时,都必须加入所有用户现有的MUC。我们发现这不实用。

我们也使用MUC进行相同的群聊,但这只是为了存储参与者,以便用户可以随时获取列表(无法使用pubsub)。

在MUC上使用pubsub的另一个好处是,ejabberd存储pubsub数据的方式更有效。我没有深入研究过这个问题,但我希望pubsub有更好的表现。

答案 2 :(得分:0)

16.09版本的新ejabberd服务器改进了多用户聊天 - MUC Sub:

  

MUC Sub的目标是尽可能地依赖现有的MUC规范,同时尽可能做出最小的改变,使移动群组会话客户端变得容易。

     

默认情况下启用此功能。要使用它,只需确保在要使用它的房间中设置新参数“允许订阅”。

以下是文档链接:https://docs.ejabberd.im/developer/proposed-extensions/muc-sub/

此处有更多信息:https://blog.process-one.net/xmpp-mobile-groupchat-introducing-muc-subscription/