OpenFire源码学习之二十七:Smack源码解析

本文详细介绍了Smack库在连接XMPP服务器、登录、获取好友列表、发送消息等方面的核心源码分析。Smack通过XMPPConnection类与服务器建立连接,并使用SASL进行身份验证。在登陆过程中,它发送特定的数据包进行TLS加密协商。此外,还探讨了Smack如何处理好友状态监听和调试功能。
摘要由CSDN通过智能技术生成

Smack

Smack是一个用于和XMPP服务器通信的类库,由此可以实现即时通讯和聊天。Android中开发通讯APP也可以使用这个包。关于smack的中文开发文档,目前网上也有很多。

下面本,将从源码中分析smack的几个案例。

连接

关于smackConnection是连接XMPP服务器的默认实现。他有两个构造函数,一个是XMPPConecttion(String) 接收服务器地址名的参数。这个是默认的比较常用的构造方法。

l 查找一个DNSSRC,首先需要找到它精确的服务器地址和端口默认是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的,但是这个是在使用BA中做的,B甚至都不知道。破坏了B原有的接口。

l 有可能破坏语义。如果A实现了Cloneable,同时有一个引用指向B,该B实现为单例模式,如果直接复制内存进行深copy的话,破坏了B的单例模式。

l 方便且更灵活,如果A引用一个不可变对象,则内存deep copy是一种浪费。Shadow copy给了程序员更好的灵活性。

  ConnectionConfiguration类实现的了Cloneable。我们来看看该类主要是做什么的呢?Smack调用了它的构造函数,根据源码的描述,该构造函数很简单,它是为DNSsrv寻找实际的主机的地址和端口。在这个构造函数有两个步骤:

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值