如何获取传入的xmpp消息的时间戳?

我正在使用aSmack库与远程xmpp服务器进行通信。 我能够发送/接收消息,但我想获取传入消息的时间戳。

你能告诉我,有可能吗? 因为我找不到关于这个问题的任何信息。

提前致谢

时间戳不是常规消息的一部分。 因此,您无法提取它。

有一个规范(如@Dmitry所述),但这仅适用于特定types的消息。 通常是那些非实时的,例如离线并在创建新订阅时发布节点的最后一个pubsub消息。 这些是内置于其中的固有延迟的消息。

由于规范时间是XMPP消息的必需属性:

http://xmpp.org/extensions/xep-0203.html#protocol

检查项:

  Offline Storage  

但是看起来有点棘手。 一旦aSmack重新编译了一些被替换的东西,所以试着像这里一样:

http://edwin.baculsoft.com/2011/06/how-to-get-offline-messages-timestamp-on-openfire/

 DelayInformation inf = null; try { inf = (DelayInformation)packet.getExtension("x","jabber:x:delay"); } catch (Exception e) { log.error(e); } // get offline message timestamp if(inf!=null) Date date = inf.getStamp(); 

可能的话,您将需要检查服务器发送的消息作为扩展值,并将"jabber:x:delay"替换为'urn:xmpp:delay'如XMPP规范示例所示。

但不确定它是否有效。

虽然在某种程度上已经在这里混合了其他答案,但我会给出如下答案……

XMPP是“实时的”……虽然这个术语对于不同的人来说意味着很多不同的东西,但一般来说你可以安全地假设你在发送消息后几乎就会收到消息 – 所有的XMPP软件都是围绕着实现而设计的这个目标。

但是,没有关于端到端延迟的实际保证。 在一般实践中,您通常会在发送方传输之后始终收到远小于一秒的消息,但网络条件可能会影响此消息。

在某些情况下,消息将被暂时延迟,例如需要建立新的服务器到服务器连接时。 这通常可能需要几秒钟,这取决于网络条件和服务器之间使用的身份validation方法。

如果收件人处于离线状态,也可能会阻止邮件 – 收件人的服务器可能会将邮件保留在“离线邮件”存储中,直到收件人联机时它可以传送邮件。

由于XMPP消息的一般即时传递,时间戳通常不包括在消息本身中,因为该信息是无用的(并假设时钟都是正确的)。

在消息被有意延迟的情况下,例如在上面的示例中,延迟消息的实体可以在消息中插入指示消息的原始时间的标签。 这在XEP-0203:延迟交付中有详细说明。

它也适用于4.1.9

 DelayInformation inf = null;
                     inf =(DelayInformation)message.getExtension(DelayInformation.ELEMENT,DelayInformation.NAMESPACE);
                     if(inf!= null){
                        日期日期= inf.getStamp();
                         System.out.println(“date:”+ date);
                     }

使用smack 4.2.0-rc2-SNAPSHOT版本,它很容易访问,

 DelayInformation delayInformation = forwarded.getDelayInformation(); delayInformation.getStamp().getTime();