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);
然后登陆,就会输出离线信息了