smack+ejabberd 获取离线消息

1 篇文章 0 订阅
1 篇文章 0 订阅

1,需要注意的是ejabberd服务器访问离线消息,跟openfire差别很大,

openfire本身是支持离线消息的,不需要进行额外处理,直接用OfflineMessageManager这个类处理就行了

OfflineMessageManager offlineManager = new OfflineMessageManager(getConnection());  

            Iterator<Message> it = offlineManager.getMessages();  

            int count = offlineManager.getMessageCount(); 

而坑爹的是Ejabberd的Community Server版本并不支持XEP-0013Flexible Offline Message Retrieval 这个协议,所以OfflineMessageManager也就用不了啦。好在Smack在很多协议API中都有关于服务端是否支持此协议的API。

2,要想获取离线消息,首先要了解ejabberd中离线消息的格式:

<message to="c1@localhost"from="localhost">

<subject>Welcome!</subject>

<body>Hi. Welcome to this XMPP server.

</body>

<delay xmlns="urn:xmpp:delay"stamp="2015-04-24T05:43:46.054Z" from="localhost">

Offline Storage

</delay>

<x xmlns="jabber:x:delay" stamp="20150424T05:43:46"from="localhost">

Offline Storage

</x>

</message>

然后对离线消息进行处理, 好在Smack在很多协议API中都有关于服务端是否支持此协议的API。比如下面这种

// 配置连接  

                ConnectionConfiguration config = new ConnectionConfiguration("10.0.0.117", 5222, "localhost");  

                //XMPPConnection.DEBUG_ENABLED = true;// 开启DEBUG模式  ,z注意:上线之前一定要把这段注释掉,要不然只能注册一次

                config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled); 

                //System.out.println(config.getSecurityMode());

                config.setCompressionEnabled(true); 

                config.setSendPresence(true); // 状态设为离线,目的为了取离线消息

                config.setSASLAuthenticationEnabled(true); // 是否启用安全验证  要先安装安全验证证书,不然这段就注释掉,不然会报错

                connection = new XMPPConnection(config);  

                connection.connect();// 连接到服务器 

                connection.addPacketListener(new PacketListener() {

        

        @Override

        public void processPacket(Packet packet) {

        // TODO Auto-generated method stub

        DelayInformation delay = (DelayInformation) packet.getExtension("x", "jabber:x:delay");

        if(delay == null){

        return;

        }

        if(packet instanceof Message){

         //System.out.println(((Message)packet).getBody());

        System.out.println("offline:"+packet.toXML());

        }

        }

        }, null);

然后登陆,就会输出离线信息了



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值