Smack
Smack是一个用于和XMPP服务器通信的类库,由此可以实现即时通讯和聊天。Android中开发通讯APP也可以使用这个包。关于smack的中文开发文档,目前网上也有很多。
下面本,将从源码中分析smack的几个案例。
连接
关于smack的Connection是连接XMPP服务器的默认实现。他有两个构造函数,一个是XMPPConecttion(String) 接收服务器地址名的参数。这个是默认的比较常用的构造方法。
l 查找一个DNS的SRC,首先需要找到它精确的服务器地址和端口默认是5222。
l 它默认引用了TLS加密协议
l 它连接资源名用“Smack”
另一种个构造方法是XMPPServer(ConnectionConfiguration),这里指定了它的配置信息
l 它需要手动设置服务器地址和端口,而不是DNS SRC查找了
l 开启压缩连接
l 自定义的安全设置,比如同样的在连接的时候采用TLS加密的方式
l 每个自定义的连接需要有个独一无二的资源名称。比如:jsmith@example.com。一个完整的地址应该是这样的:jsmith@example.com/Smack
一、测试连接
编写客户端连接代码
public static void main(String[] args) {
//1打开调试
XMPPConnection.DEBUG_ENABLED=true;
//2申明连接
XMPPConnection conn = new XMPPConnection("127.0.0.1");
try {
//3建立连接
conn.connect();
//登陆
conn.login("703000", "123");
} catch (XMPPException e) {
e.printStackTrace();
}
}
申明连接:
XMPPConnection conn = new XMPPConnection("127.0.0.1");
XMPPConnection继承Connection抽象类。
在XmppConnection的构造函数中:
public XMPPConnection(String serviceName) {
// 创建这个新连接的配置
super(new ConnectionConfiguration(serviceName));
config.setCompressionEnabled(false);
config.setSASLAuthenticationEnabled(true);
config.setDebuggerEnabled(DEBUG_ENABLED);
}
1.它会创建当前连接配置也就是ConnectionConfiguration该类实现了Cloneable
接口。Cloneable是一个克隆类。所谓克隆就是复制一个一模一样的类。Java中之所
以有克隆的存在,原因很简单:
l 效率和简单性,简单的copy一个对象在堆上的的内存比遍历一个对象网然后内存深
copy明显效率高并且简单。
l 不给别的类强加意义。如果A实现了Cloneable,同时有一个引用指向B,如果直接复制内存进行深copy的话,意味着B在意义上也是支持Clone的,但是这个是在使用B的A中做的,B甚至都不知道。破坏了B原有的接口。
l 有可能破坏语义。如果A实现了Cloneable,同时有一个引用指向B,该B实现为单例模式,如果直接复制内存进行深copy的话,破坏了B的单例模式。
l 方便且更灵活,如果A引用一个不可变对象,则内存deep copy是一种浪费。Shadow copy给了程序员更好的灵活性。
ConnectionConfiguration类实现的了Cloneable。我们来看看该类主要是做什么的呢?Smack调用了它的构造函数,根据源码的描述,该构造函数很简单,它是为DNS的srv寻找实际的主机的地址和端口。在这个构造函数有两个步骤:
1)执行DNS,查找需要获取的主机和端口
hostAddresses = DNSUtil.resolveXMPPDomain(serviceName);
DNSUtil是一个DNS查找主机的工具类,在这里smack调用了
resolveXMPPDomain()方法。
再来看下这个方法吧:
public static List<HostAddress> resolveXMPPDomain(final String domain) {
if (dnsResolver == null) {
List<HostAddress> addresses = new ArrayList<HostAddress>(1);
addresses.add(new HostAddress(domain, 5222));
return addresses;
}
return resolveDomai