2012-06-21 86 views
16

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

请问你能告诉我,有没有可能?因为我找不到这个问题。对于XMPP消息

由于规格的时间提前感谢

+0

ü让任何解决方案SM问题IM面临 – CoronaPintu

回答

11

时间戳不是常规消息的一部分。因此你不能提取它。

有一个规范(如@Dmitry所述),但这只适用于特定类型的消息。通常情况下,那些不是实时的,如创建新订阅时脱机并发布节点的最后一个pubsub消息。这些是内置固有延迟的消息。

9

需要的属性:

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

检查的<message<delay项目:

<delay xmlns='urn:xmpp:delay' 
from='capulet.com' 
stamp='2002-09-10T23:08:25Z'> 
Offline Storage 
</delay> 

但得到它看起来有点棘手。只要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(); 

Problably,你将需要检查的消息发送的内容服务器扩展值并用替换为'urn:xmpp:delay',如XMPP规范示例中所示。

但不知道它是否有效。

+0

请不要如果能工作,别忘记标记答案。 – Dmitry

+0

不幸的是,它没有帮助,但我非常感谢您的帮助 – Infernus

+3

这个答案是错误的,因为上述协议仅适用于邮件具有历史性质的特定情况下的邮件。它不适用于OP的问题(一般信息),因为这在XMPP中不受支持。 – Robin

4

虽然部分其他答案的融合已经在这里,我将提出的答案如下...

XMPP是“实时” ......虽然这个词可能意味着很多不同的事情不同人们,一般而言,您可以安全地假设您在收到邮件后几乎收到邮件 - 所有XMPP软件都是围绕实现此目标而设计的。

但是,对端到端延迟没有实际保证。通常情况下,发件人发送邮件后,您通常会收到远不到一秒的邮件,但网络条件可能会影响此信息。

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

如果收件人处于脱机状态,收件人的服务器可能会将邮件保存在“脱机邮件”存储中,直到收件人联机时才能将邮件递送出去。

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

在消息被明知地延迟的情况下,例如在上面的示例中,延迟消息的实体可以在消息中插入指示消息的原始时间的标签。详情请见XEP-0203: Delayed Delivery

+0

当然,有些服务器如OpenFire在发送聊天记录时使用XEP-0203。 –

0

随着嫌4.2.0-RC2-快照版本可以很容易地访问,

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

它也适用于4.1.9

 
DelayInformation inf = null; 
        inf = (DelayInformation)message.getExtension(DelayInformation.ELEMENT,DelayInformation.NAMESPACE); 
        if (inf != null){ 
         Date date = inf.getStamp(); 
         System.out.println("date: "+date); 
        } 
相关问题