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文檔都沒找到,暈死 |