天天看点

smack+ejabberd 获取离线消息

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="[email protected]"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);

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