我正在开发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收到消息。
我怎样才能做到这一点?
感谢。
答案 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的消息。
因此,除非您知道您的服务器支持并且配置为允许第二种选择,否则您无法完成您尝试执行的操作。
答案 2 :(得分:0)
为了参与即时消息传递和在线状态活动,客户端(即设备)应在服务器上建立会话。
如果已经有一个同名的活动资源,则服务器 必须(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中进行配置