我正在开发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获得消息。
我怎样才能做到这一点?
谢谢。
发布于 2015-07-20 13:04:29
在XMPP中,消息只能一次性传递:
但是,如果您希望其他客户端重新同步,则应该依赖XEP-0313:消息存档管理。此规范描述了客户端如何访问消息历史记录并重新同步其状态。
例如,您可以使用查询给定时间后的所有消息存档。这将允许连接的客户端获取自上次联机以来错过的所有消息:
<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>
发布于 2015-07-21 19:23:30
除了Mickael的回答,你应该知道一些事情。如果指定一个完整的JID作为要处理的地址,则该消息将仅传递到该单个端点。
只有在下列情况下才会为同一用户传递消息到多个资源
最后一点至关重要。根据规范,服务器可以通过两种方式处理发送到裸JID的消息。
因此,除非您知道您的服务器支持并配置为允许第二种选择,否则无论如何您都无法完成您想要做的事情。
发布于 2018-08-23 05:44:56
为了参与即时消息传递和存在活动,客户端(即设备)应该在服务器上建立会话。
如XMPP文档中所示
如果已经有同名的活动资源,服务器必须(1)终止活动资源并允许新请求的会话,或者(2)不允许新请求的会话并维护活动资源。这些服务器中的哪一个取决于实现,尽管建议实现case #1。在案例1中,服务器应该向活动资源发送流错误,终止XML流和活动资源的底层TCP连接,并向新请求的会话返回类型为“resource”(表示成功)的IQ节。在第二种情况下,服务器应该向新请求的会话发送一个节错误,但是维护该连接的XML流,以便新请求的会话在发送另一个会话请求之前有机会协商一个不冲突的资源标识符。
(https://www.rfc-editor.org/rfc/rfc6120#section-7.7.2.2)
因此,您应该根据应用程序的要求,首先决定处理会话的方式。现在,由于您使用的是Ejabberd,所以可以通过定义选项资源来配置它。
但是,如果仍然希望使用多个会话,则可以使用Management XEP-0313
这样您就可以在服务器上存储聊天历史记录,然后检索。这可以通过使用选项国防部在ejabberd中进行配置。
https://stackoverflow.com/questions/31515088
复制相似问题