XMPP Smack Chat应用程序中的多设备支持

时间:2015-07-20 11:16:29

标签: xmpp chat ejabberd smack

我正在开发Android聊天应用程序。

我的要求是向多个设备发送消息。

在两个用户A和用户B之间考虑这种情况:

User A logs in and sends message to User B.
User B logs in from Device 1 and receives message from User A.
User B logs in from Device 2 but does not get message from User A.

根据我的要求,用户B也应该从设备2中的用户A收到消息。

我怎样才能做到这一点?

感谢。

3 个答案:

答案 0 :(得分:1)

在XMPP中,消息仅在一次转发中传递:

  • 分享最高优先级的在线资源,
  • 到第一个通过离线消息传递连接的客户端。

但是,如果您希望其他客户端重新同步,则应该依赖XEP-0313: Message Archive Management。此规范描述了客户端如何访问消息历史记录并重新同步其状态。

您可以举例query the message archive for all messages after a given time。这将允许连接的客户端获取自上次在线以来错过的所有消息:

<iq type='set' id='juliet1'>
  <query xmlns='urn:xmpp:mam:0'>
    <x xmlns='jabber:x:data'>
      <field var='FORM_TYPE'>
        <value>urn:xmpp:mam:0</value>
      </field>
      <field var='start'>
        <value>2010-08-07T00:00:00Z</value>
      </field>
    </x>
  </query>
</iq>

答案 1 :(得分:0)

除了Mickael的答案,你应该知道一些事情。如果您指定一个完整的JID作为地址,那么该消息将仅传递给该单个端点。

只有在

时才会为同一用户提供多个资源
  • 地址是裸JID
  • 所有连接都具有相同的优先级
  • 服务器配置为传送到多个端点。

最后一点至关重要。根据规范,服务器可以通过两种方式处理发送到裸JID的消息。

  • 发送至其中一个具有最高优先级的连接。哪一个是由服务器确定的,它可以是第一个连接的,最后一个,或者如果有多个具有相同优先级的连接则是随机选择。
  • 发送给所有优先级最高的连接。

因此,除非您知道您的服务器支持并且配置为允许第二种选择,否则您无法完成您尝试执行的操作。

答案 2 :(得分:0)

为了参与即时消息传递和在线状态活动,客户端(即设备)应在服务器上建立会话。

根据XMPP Documentation

  

如果已经有一个同名的活动资源,则服务器   必须(1)终止活动资源并允许   新请求的会话,或者(2)禁止新请求的会话   并维护活动资源。服务器执行哪一个操作   尽管建议您执行案例1。在情况#1中,服务器应向活动资源发送流错误,终止XML流和基础TCP   连接活动资源,并返回类型为IQ的节   “结果”(表示成功)到新请求的会话。在#2的情况下,服务器应该向新请求的会话发送节错误,但应为此保留XML流   连接,以便新请求的会话有机会   在发送另一个资源标识符之前,先协商一个无冲突的资源标识符   请求建立会话。

https://tools.ietf.org/html/rfc6120#section-7.7.2.2

因此,您首先应根据应用程序要求决定处理会话的方式。 现在,由于您正在使用Ejabberd,因此可以通过定义选项resource_conflict

对其进行配置

但是,如果您仍然想使用多个会话,则可以使用消息存档管理-XEP-0313

因此,您可以将聊天记录存储在服务器上,然后进行检索。可以使用选项mod_mam

在ejabberd中进行配置