XMPP客户端库Smack 4.0.6版开发
一、Smack库概述
Smack是一个开源、易用的XMPP/Jabber客户端库,它使用Java语言开发,由Jive Software开发。
Smack的优点是编程简单。
Smack的缺点是其API并非为大量并发用户设计,每个客户都要1个线程,占用资源相对较,因此用Smack做模拟测试时,1台机器只能模拟有限(数千个)客户。
截止2014年11月27日,Smack库已经发展到4.0.6版。
最新的好消息是Smack在4.1.0版后将直接支持Android系统,而无需再使用以前的Smack移植版aSmack库了。
Smack库源码托管于GitHub,主页见: https://github.com/igniterealtime/Smack/
二、Smack 4的改变
Smack库从3.4版发展到4.0.x版后,其API有较大的变化,主要有:
1、把Connection类重命名为XMPPConnection类
XMPPConnection类是XMPPTCPConnection类和XMPPBOSHConnection类的父类。
2、把各种Provider类进行了分包
3、keep-alive(持久连接)机制从smack-core库移到了smack-extensions库
keep-alive机制现在由PingManager类提供。
4、PrivacyList类的toString()方法重命名为getName()
5、当Chat实例的所有引用都撤掉后,应该调用Chat.close()方法
否则Chat对象会有内存泄露的隐患,直到ChatManager对象被垃圾回收器回收后内存泄露隐患才会消失。
6、ServerTrustManager类被移除了
如果要使用带SSL认证的XMPP,你只需提供自己的SSLContext对象给ConnectionConfiguration对象即可。
7、Packet.setProperty()从smack-core库移到了smack-extensions库
其API现在可以在org.jivesoftware.smackx.jiveproperties包中找到。
8、Connection.getAccountManager()方法现在改成了AccountManager.getInstance(XMPPConnection)方法
9、异常API做了改进
10、ToContains过滤器被移除了
三、Smack库的特征
1、极度简单易用,API功能强大
发送一条文本消息给某个用户只需几行代码:
点击(此处)折叠或打开
- AbstractXMPPConnection connection = new XMPPTCPConnection("mtucker", "password", "jabber.org");
- connection.connect();
- connection.login();
- Chat chat = ChatManager.getInstanceFor(connection)
- .createChat("jsmith@jivesoftware.com", new MessageListener(){
- public void processMessage(Chat chat, Message message){
- System.out.println("Received message: " + message);
- }
- });
- chat.sendMessage("Howdy!");
1)无需熟悉XMPP的XML格式,甚至都不需要了解XML
2)提供了简单的M2M通信
Smack让开发者可以对每条消息都设置大量的属性,属性中还可以包含Java对象。
3)基于Apache许可证的开源代码,这意味着你可以把Smack放入你自己的商业软件中。
四、Smack库的组成
Smack库可以内嵌到任意的Java应用程序中。Smack库有数个JAR文件组成,非常具有灵活性。
1、smack-core.jar
提供了核心XMPP功能。都是XMPP RFC规范定义的XMPP特性。
2、smack-extensions.jar
支持许多由XMPP Standards Foundation定义的扩展(XEP)功能。包括群聊、文件传输、用户搜索等等。
以后可查看文档《扩展手册》:
https://github.com/igniterealtime/Smack/blob/master/documentation/extensions/index.html
(目前还是无效的)
3、smack-experimental.jar
支持许多由XMPP Standards Foundation定义的体验性(XEP)功能。其API和功能特性都被认为是不稳定的。
4、smack-legacy.jar
支持许多由XMPP Standards Foundation定义的遗留(XEP)功能。
5、smack-bosh.jar
支持BOSH通信(XEP-0124规范定义的)。此代码被认为处于Beta阶段。
6、smack-jingle.jar
支持Jingle。此代码很老,目前处于无维护的状态。
7、smack-resolver-dnsjava.jar
支持对DNS SRV记录的解析,主要用于那些不支持javax.naming API的平台。
8、smack-debug.jar
用于协议流量的增强型GUI调试器。当调试模式开启后,如果它在类路径下,它会自动被使用。
以后可查看文档《调试模式》:
https://github.com/igniterealtime/Smack/blob/master/documentation/debugging.html
(目前还是无效的)
五、Smack的配置
Smack的初始化过程涉及到2阶段的调用。
1、初始化系统属性
通过SmackConfiguration类初始化所有的系统可访问属性,这些属性都是通过getXXX方法取回属性值的。
2、初始化启动类
任意类如果继承了SmackInitializer接口后,都可以在调用initialize()方法后得到初始化,这意味着得到初始化的类在启动后都是活动的。
如果没有继承SmackInitializer接口,那么要实现初始化,必须要放置一个静态代码块来实现——他在类装载时会自动执行。
初始化是通过配置文件来完成的。默认情况下,Smack会载入Smack JAR文件中内嵌的配置文件(它位于org.jivesoftware.smack/smack-config.xml)。这个指定的配置文件包含了一系列需载入初始化的类列表。所有的管理器类型的类都需要被初始化,这些管理器类就包含在上面所说的初始化列表中。