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

Smack

SmackAndroid

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

连接

关于

l查找一个

l它默认引用了TLS加密协议

l它连接资源名用“Smack”

另一种个构造方法是XMPPServer(ConnectionConfiguration),这里指定了它的配置信息

l它需要手动设置服务器地址和端口,而不是DNSSRC查找了

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

public XMPPConnection(String serviceName) {// 创建这个新连接的配置super(new ConnectionConfiguration(serviceName));config.setCompressionEnabled(false);config.setSASLAuthenticationEnabled(true);config.setDebuggerEnabled(DEBUG_ENABLED);}

1.它会创建当前连接配置也就是

以有克隆的存在,原因很简单:

l效率和简单性,简单的copy一个对象在堆上的的内存比遍历一个对象网然后内存深

copy明显效率高并且简单。

l不给别的类强加意义。如果

l有可能破坏语义。如果

l方便且更灵活,如果

再来看下这个方法吧:

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 resolveDomain(domain, 'c');}

这里的HostAddress其实就是一个普通的实例类,里面包含这地址、端口之类的基

本信息。而这个构造函数也就是根据地址参数给定一个正式域名和端口号。

2)是一个初始化的过程。

在这个初始化的方法中,主要是构建一个信任的类库,这里呢,,默认的则是jrehome

StringBuilder。

依次读取所需的配置环境。接在做的则是:设置根据代理提供的SocketFactory。

到了这里,创建连接的配置都做完了。

2.设置压缩流:

如果连接使用压缩流的话,压缩流在建立TLS成立后开始请求,在流压缩后,网络流量

将降低到90%。

3.设置SASL认证

这里默认的情况是使用SASL认证的。

4.设置连接调试

这里默认也选择了true.

关于创建连接的初始化配置已经完成了。现在就开始了真正的连接了。下面我们就一起来看看它究竟是如何来创建的连接的。

conn.connect();

public void connect() throws XMPPException {// Establishes the connection, readers and writersconnectUsingConfiguration(config);// Automatically makes the login if the user was previouslly connected successfully// to the server and the connection was terminated abruptlyif (connected && wasAuthenticated) {// Make the logintry {if (isAnonymous()) {// Make the anonymous loginloginAnonymously();}else {login(config.getUsername(), config.getPassword(),config.getResource());}notifyReconnection();}catch (XMPPException e) {e.printStackTrace();}}}

套接字工厂是一种捕获与正被创建的套接字相关的各种策略的简单方式,以不需要对请求套接字的代码进行特殊配置的方式生成这种套接字。它有个方法(InetAddresshost,intport):

1)设置读写的实例变量initReaderAndWriter()

private void initReaderAndWriter() throws XMPPException {try {if (compressionHandler == null) {reader =new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));}else {try {OutputStream os = compressionHandler.getOutputStream(socket.getOutputStream());writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));InputStream is = compressionHandler.getInputStream(socket.getInputStream());reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));}…….// If debugging is enabled, we open a window and write out all network traffic.initDebugger();}

2)添加消息包监听。

()

这里用到了一个线程来打开这个流服务

writerThread = new Thread() {public void run() {writePackets(this);}};<span style="color:#000000;background:rgb(255,255,255);"> 4<span style="font-family:宋体;">)开始读数据包,</span></span><span style="color:#000000;background:rgb(255,255,255);">它是一个</span>阻塞方法,直到我们得到一个开放流数据包从服务器返回。synchronized public void startup() throws XMPPException {readerThread.start();try {int waitTime = SmackConfiguration.getPacketReplyTimeout();wait(3 * waitTime);}catch (InterruptedException ie) {// Ignore.}if (connectionID == null) {throw new XMPPException("Connection failed. No response from server.");}else {connection.connectionID = connectionID;}}

在这个方法里面首先会启动数据包的读方法。然后根据设置的超时时间,smack

设置的默认超时时间为5000毫秒

在这里已经和openfire建立连接了。在openfire的开发环境里面,已经监听到了

Smack的请求消息了。这里我们可以看到smack发送了一条流消息

<stream:stream to="127.0.0.1" xmlns="jabber:client" xmlns:stream="" version="1.0">

Smack想服务端发动tls

<starttlsxmlns="urn:ietf:params:xml:ns:xmpp-tls"/>

当服务端接收到

所有的赏赐都只是被用来奖励工作成果的。

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

相关文章:

你感兴趣的文章:

标签云: