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.

英文退化了点,汗,大意就是,必须在发送在线信息之前去获取离线消息

刚开始没看这个,结果在上线之后,去取,结果。。。。离线消息数量总是为零,囧

首先,连接,状态要设为离线

[java] view plaincopyprint?
ConnectionConfiguration connConfig = new ConnectionConfiguration(serverDomain); 

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

connection = new XMPPConnection(connConfig); 
connection.connect(); 

然后,登陆

connection.login(userName, pwd);

接着,拿离线消息

[java] view plaincopyprint?
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文档都没找到,晕死

就这些

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值