天天看點

XMPP——Smack[6]離線消息和離線檔案的實作

終篇,三天所學所用,也就這些,如果需要大家要自己去查資料研究研究,功能其實可以很強大的

可惜界面做得不好,一大短處,從大一迄今沒整好,主要是個人審美不行,哎

畢業季呀畢業季,明天擺攤賣書,再半月就可能和生活四年的兄弟姐妹說再見,考研考公務員工作的,各奔東西了,我也将南下杭州

感慨,天下無不散之筵席

在此祝所有剛畢業的,學業事業有成吧

不廢話了,貌似最近太感性了,理科男,傷不起呀

1.離線消息

  openfire本身是支援離線消息的,不需要進行額外處理,可以用spark測試下

  使用smack,其實他提供了相應的方法

  Class OfflineMessageManager

  可以看下描述

The OfflineMessageManager helps manage offline messages even before the user has sent an available presence. When a user asks for his offline messages before sending an available presence then the server will not send a flood with all the offline messages when the user becomes online. The server will not send a flood with all the offline messages to the session that made the offline messages request or to any other session used by the user that becomes online.

英文退化了點,汗,大意就是,必須在發送線上資訊之前去擷取離線消息 

剛開始沒看這個,結果在上線之後,去取,結果。。。。離線消息數量總是為零,囧

首先,連接配接,狀态要設為離線

  ConnectionConfiguration connConfig = new ConnectionConfiguration(serverDomain);

connConfig.setSendPresence(false); // where connConfig is object of .

connection = new XMPPConnection(connConfig);

connection.connect();

然後,登陸

  connection.login(userName, pwd);

接着,拿離線消息

  OfflineMessageManager offlineManager = new OfflineMessageManager(

Client.getConnection());

try {

Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager

.getMessages();

System.out.println(offlineManager.supportsFlexibleRetrieval());

System.out.println("離線消息數量: " + offlineManager.getMessageCount());

Map<String,ArrayList<Message>> offlineMsgs = new HashMap<String,ArrayList<Message>>();

while (it.hasNext()) {

org.jivesoftware.smack.packet.Message message = it.next();

System.out

.println("收到離線消息, Received from 【" + message.getFrom()

+ "】 message: " + message.getBody());

String fromUser = message.getFrom().split("/")[0];

if(offlineMsgs.containsKey(fromUser))

{

offlineMsgs.get(fromUser).add(message);

}else{

ArrayList<Message> temp = new ArrayList<Message>();

temp.add(message);

offlineMsgs.put(fromUser, temp);

}

}

//在這裡進行處理離線消息集合......

Set<String> keys = offlineMsgs.keySet();

Iterator<String> offIt = keys.iterator();

while(offIt.hasNext())

{

String key = offIt.next();

ArrayList<Message> ms = offlineMsgs.get(key);

TelFrame tel = new TelFrame(key);

ChatFrameThread cft = new ChatFrameThread(key, null);

cft.setTel(tel);

cft.start();

for (int i = 0; i < ms.size(); i++) {

tel.messageReceiveHandler(ms.get(i));

}

}

offlineManager.deleteMessages();

} catch (Exception e) {

e.printStackTrace();

}

記得最後要把離線消息删除,即通知伺服器删除離線消息

offlineManager.deleteMessages();

否則,下次上了消息還存在

接着,上線

 Presence presence = new Presence(Presence.Type.available);

        connection.sendPacket(presence);

2.離線檔案

這個我沒實作,汗

主要思想:開發openfire插件,攔截離線檔案,将檔案存到伺服器上,同時在資料庫裡開一張表,存儲檔案資訊

               當使用者上線時,查表,若是有,根據路徑,拿了發送

當然,大家可以谷歌下是否有相應的插件,時間緊迫,我倒是沒找着

到這裡,大概就這些了,對了,還擴充了個視訊音頻聊天,不過使用的是JMF,點對點的,本來打算使用jingle的,結果連API文檔都沒找到,暈死

就這些