2012-06-21 10 views
16

Estoy usando una biblioteca de bloqueo para comunicarme con el servidor xmpp remoto. Puedo enviar/recibir mensajes, pero quiero obtener la marca de tiempo del mensaje entrante.¿Cómo obtener la marca de tiempo del mensaje xmpp entrante?

¿Podría decirme por favor, es posible? Porque no puedo encontrar nada sobre esta pregunta. atributo

Gracias de antemano

+0

u consiguió ningún problema im sm solución frente – CoronaPintu

Respuesta

11

La marca de tiempo no es parte de los mensajes normales. Por lo tanto, no puedes extraerlo.

Hay una especificación (mencionada por @Dmitry), pero esto solo se aplica a tipos específicos de mensajes. Normalmente, aquellos que NO están en tiempo real, como sin conexión y que publican el último mensaje pubsub de un nodo cuando se crea una nueva suscripción. Estos son mensajes con un retraso inherente incorporado en ellos.

9

debido al tiempo de especificaciones se requiere para el mensaje XMPP:

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

Compruebe el elemento <delay de <message:

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

Sin embargo, conseguir que se ve una poco complicado. Tan pronto como aSmack se vuelve a compilar Smack con algunas cosas reemplazado, así que intenta conseguir de la manera como aquí:

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, tendrá que comprobar qué servidor envía con el mensaje como valor de la extensión y reemplace "jabber:x:delay" con 'urn:xmpp:delay' como se muestra en el ejemplo de especificaciones XMPP.

Pero no estoy seguro de si funciona.

+0

Por favor, no no te olvides de marcar la respuesta si funcionará. – Dmitry

+0

Lamentablemente no sirvió de nada, pero soy muy apreciado por su ayuda – Infernus

+3

Esta respuesta es incorrecta, ya que el protocolo mencionado solo se aplica a los mensajes en situaciones específicas donde los mensajes son de naturaleza histórica. No se aplica a la pregunta del OP (mensajes en general), ya que esto no es compatible con XMPP. – Robin

4

Aunque, en parte, una mezcla de las otras respuestas que ya están aquí, yo presentaría la respuesta de la siguiente manera ...

XMPP es "tiempo real" ... aunque este término puede significar muchas cosas diferentes para diferentes En general, puede suponer que recibe mensajes (casi) tan pronto como se envían: todo el software XMPP está diseñado para cumplir este objetivo.

Sin embargo, no existe una garantía real sobre la latencia de extremo a extremo. En la práctica general, siempre recibirá un mensaje mucho menos de un segundo después de que el remitente lo haya transmitido, aunque las condiciones de la red pueden afectarlo.

En algunos casos, el mensaje se retrasará temporalmente, como cuando se necesita establecer una nueva conexión de servidor a servidor. En general, esto puede demorar unos segundos, dependiendo nuevamente de las condiciones de la red y del método de autenticación utilizado entre los servidores.

Un mensaje también puede retrasarse si el destinatario está desconectado: el servidor del destinatario puede mantener el mensaje en un almacén de "mensajes sin conexión", hasta que pueda entregarlo cuando el destinatario se conecte.

Debido a la entrega instantánea general de mensajes XMPP, las marcas de tiempo generalmente no se incluyen en el mensaje en sí, ya que esa información es inútil (y supone que los relojes son todos correctos).

En los casos en que el mensaje se retrasa deliberadamente, como en los ejemplos anteriores, la entidad que retrasa el mensaje puede insertar una etiqueta en el mensaje que indica la hora original del mensaje. Esto se detalla en XEP-0203: Delayed Delivery.

+0

Absolutamente. Algunos servidores como OpenFire utilizan XEP-0203 al enviar el historial de chat. –

0

Con justo versión 4.2.0-RC2-INSTANTÁNEA que es fácil de acceder,

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

También funciona para 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); 
        } 
Cuestiones relacionadas