2012-06-21 30 views
16

Tôi đang sử dụng thư viện aSmack để giao tiếp với máy chủ xmpp từ xa. Tôi có thể gửi/nhận tin nhắn, nhưng tôi muốn nhận được dấu thời gian của tin nhắn gửi đến.Cách nhận dấu thời gian của thông báo xmpp đến?

Bạn có thể cho tôi biết, có thể nào không? Bởi vì tôi không thể tìm thấy bất cứ điều gì về câu hỏi này. Thuộc tính

Cảm ơn trước

+0

u có bất kỳ im giải pháp vấn đề phải đối mặt với sm – CoronaPintu

Trả lời

11

Dấu thời gian không phải là một phần của thư thông thường. Do đó bạn không thể giải nén nó.

Có thông số kỹ thuật (như đã đề cập bởi @Dmitry), nhưng điều này chỉ áp dụng cho các loại thư cụ thể. Thông thường những người không phải là thời gian thực, chẳng hạn như ngoại tuyến và xuất bản thông báo pubsub cuối cùng của một nút khi một đăng ký mới được tạo. Đây là những thư có độ trễ cố hữu được tích hợp vào chúng.

9

Do số kỹ thuật thời gian là cần thiết cho thông điệp XMPP:

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

Kiểm tra <delay mục của <message:

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

Nhưng nhận nó trông giống một chút khéo léo. Càng sớm càng aSmack được biên dịch lại Smack với một số công cụ thay thế, vì vậy hãy thử để có được nó theo cách tương tự ở đây:

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, bạn sẽ cần phải kiểm tra những gì máy chủ gửi với thông điệp như giá trị mở rộng và thay thế "jabber:x:delay" bằng 'urn:xmpp:delay' như được hiển thị trong ví dụ về thông số kỹ thuật XMPP.

Nhưng không chắc chắn nếu nó hoạt động.

+0

Xin don đừng quên đánh dấu câu trả lời nếu sẽ làm việc. – Dmitry

+0

Thật không may là nó không giúp ích gì, nhưng tôi rất cảm kích vì sự giúp đỡ của bạn – Infernus

+3

Câu trả lời này là sai, vì giao thức được đề cập chỉ áp dụng cho các thư trong các tình huống cụ thể trong đó các thư có tính chất lịch sử. Nó không áp dụng cho câu hỏi của OP (thông điệp nói chung), vì điều này không được hỗ trợ trong XMPP. – Robin

4

Mặc dù trong phần một sự pha trộn của các câu trả lời khác đã ở đây, tôi sẽ trình bày các câu trả lời như sau ...

XMPP là "thời gian thực" ... mặc dù thuật ngữ có thể có nghĩa là rất nhiều thứ khác nhau để khác nhau mọi người, nói chung bạn có thể yên tâm giả định rằng bạn nhận được tin nhắn (gần như) ngay khi chúng được gửi đi - tất cả phần mềm XMPP được thiết kế xung quanh hoàn thành mục tiêu này.

Tuy nhiên, không có đảm bảo thực tế về độ trễ đầu cuối. Nói chung, thông thường bạn sẽ luôn nhận được một tin nhắn ít hơn một giây sau khi nó được gửi bởi người gửi, mặc dù điều kiện mạng có thể ảnh hưởng đến điều này.

Trong một số trường hợp, thông báo sẽ tạm thời bị trì hoãn, chẳng hạn như khi thiết lập kết nối máy chủ đến máy chủ mới. Quá trình này có thể mất tới vài giây, tùy thuộc vào điều kiện mạng và phương thức xác thực được sử dụng giữa các máy chủ.

Tin nhắn cũng có thể được giữ nếu người nhận đang ngoại tuyến - máy chủ của người nhận có thể giữ tin nhắn trong cửa hàng "tin nhắn ngoại tuyến", cho đến khi nó có thể gửi tin nhắn khi người nhận trực tuyến.

Do việc phân phối nhanh các tin nhắn XMPP, dấu thời gian thường không được bao gồm trong thông điệp, vì thông tin đó vô ích (và giả định đồng hồ là chính xác).

Trong trường hợp thư được cố ý trì hoãn, ví dụ như trong ví dụ trên, thực thể trì hoãn thư có thể chèn thẻ vào thông báo cho biết thời gian ban đầu của thư. Chi tiết này được mô tả chi tiết trong XEP-0203: Delayed Delivery.

+0

Tuyệt đối.Một số máy chủ như OpenFire sử dụng XEP-0203 khi gửi lịch sử trò chuyện. –

0

Với cú đập phiên bản 4.2.0-RC2-SNAPSHOT thật dễ dàng để truy cập,

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

Nó cũng làm việc cho 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); 
        } 
Các vấn đề liên quan