Chinaunix
標(biāo)題: XMPP——Smack[6]離線消息和離線文件的實現(xiàn) [打印本頁]
作者: landuochong 時間: 2011-12-22 08:51
標(biāo)題: XMPP——Smack[6]離線消息和離線文件的實現(xiàn)
1.離線消息
openfire本身是支持離線消息的,不需要進(jìn)行額外處理,可以用spark測試下
使用smack,其實他提供了相應(yīng)的方法
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.
英文退化了點,汗,大意就是,必須在發(fā)送在線信息之前去獲取離線消息
剛開始沒看這個,結(jié)果在上線之后,去取,結(jié)果。。。。離線消息數(shù)量總是為零,囧
首先,連接,狀態(tài)要設(shè)為離線
- ConnectionConfiguration connConfig = new ConnectionConfiguration(serverDomain);
-
- connConfig.setSendPresence(false);
-
- 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("離線消息數(shù)量: " + 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();
- }
記得最后要把離線消息刪除,即通知服務(wù)器刪除離線消息
offlineManager.deleteMessages();
否則,下次上了消息還存在
接著,上線
Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
2.離線文件
這個我沒實現(xiàn),汗
主要思想:開發(fā)openfire插件,攔截離線文件,將文件存到服務(wù)器上,同時在數(shù)據(jù)庫里開一張表,存儲文件信息
當(dāng)用戶上線時,查表,若是有,根據(jù)路徑,拿了發(fā)送
當(dāng)然,大家可以谷歌下是否有相應(yīng)的插件,時間緊迫,我倒是沒找著
到這里,大概就這些了,對了,還擴(kuò)展了個視頻音頻聊天,不過使用的是JMF,點對點的,本來打算使用jingle的,結(jié)果連API文檔都沒找到,暈死
歡迎光臨 Chinaunix (http://www.72891.cn/) |
Powered by Discuz! X3.2 |