android 中 smack重新登录openfire服务器

一.利用smack 中ReconnectionManager、

在新建Xmpp连接类的时候要加入以下代码:


static {
try {
 
Class.forName("org.jivesoftware.smack.ReconnectionManager");

} catch (Exception e) {
e.printStackTrace();
}
}


 XMPPConnection一定要把setReconnectionAllowed设置为true

private static XMPPConnection openConnection(String url, String pcName) {

		try {
			// url、端口,也可以设置连接的服务器名字,地址,端口,用户。
			Log.i("XmppTool", "url:" + url + "  pcname:" + pcName);
			ConnectionConfiguration connConfig = new ConnectionConfiguration(
					url, 5222, pcName);
			  connConfig.setReconnectionAllowed(true); // 允许重连 
 
			Log.i("XmppTool", connConfig.toString());
			con = new XMPPConnection(connConfig);
			Log.i("XmppTool", "1" + con.toString());
			con.connect();
			Log.i("XmppTool", "2" + con.toString());

		} catch (XMPPException xe) {

			Log.e("XmppToolException", xe.getMessage());
			xe.printStackTrace();

			// throw new IllegalStateException(xe);
			// /add begin 2015.09.25 wangxingtong 处理空指针
		} catch (NullPointerException e) {
			e.printStackTrace();
		}
		// /add end
		return con;
	}

完整的xmpp类如下:

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import android.util.Log;

/**
 * Smack连接类
 * 
 */
public class XmppTool {

	private static XMPPConnection con;

	static {
		try {
			Class.forName("org.jivesoftware.smack.ReconnectionManager");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 

	/**
	 * 连接smack
	 * 
	 * @param url
	 * @param pcName
	 */
	private static XMPPConnection openConnection(String url, String pcName) {

		try {
			// url、端口,也可以设置连接的服务器名字,地址,端口,用户。
			
			ConnectionConfiguration connConfig = new ConnectionConfiguration(
					url, 5222, pcName);
			
			connConfig.setReconnectionAllowed(true); // 允许重连

			con = new XMPPConnection(connConfig);
			con.connect();
			

		} catch (XMPPException xe) {

			xe.printStackTrace();

		} catch (NullPointerException e) {
			e.printStackTrace();
		}
		return con;
	}

	public static synchronized XMPPConnection getConnection(String url,
			String pcName) {

		if (con == null) {
			con = openConnection(url, pcName);
		}
		return con;
	}
//其他方法可自行添加
}


 二.添加ConnectionListener 进行重连

首先新建自己的连接监听,继承自ConnectionListioner

此监听主要是对上一个ReconnectionManager的重连的监听,重连正常时可以自动的重新连接到openfire服务器,出现问题时,就要自行进行重登操作,主要是在重写的重新登录失败的方法reconnectionFailed(Exception arg0)  中进行操作

1.登录成功时要建立监听:

MyConnnectionListerer myConnnectionListerer = new MyConnnectionListerer();XmppTool.getConnection(SERVICE_URL, SERVICE_NAME).addConnectionListener(myConnnectionListerer);

建立自己的连接监听,继承自ConnectinListioner:

public class MyConnnectionListerer implements ConnectionListener {

		@Override
		public void connectionClosed() {
//当smack连接正常关闭时进行操作
//注意当服务器强行使你退出时也会进入的此方法
//在此可以进行 reconnectiongFailed中重连操作

		}

		@Override
		public void connectionClosedOnError(Exception arg0) {
			 
//当连接异常关闭时进行操作
//包括网路连接中断,服务器故障等
//在此可以进行 reconnectiongFailed中重连操作
		}

		@Override
		public void reconnectingIn(int arg0) {
 //正在重新登录openfire服务器

		}

		@Override
		public void reconnectionFailed(Exception arg0) {
//重登失败
//利用ReconnectionManager重连失败时会进入到此方法
//重连操作:
//无法自动重连时要关闭此连接监听XmppTool.getConnection().removeConnectionListener(myConnnectionListerer);
//然后关闭清空Xmpp的连接,再重新启动新的连接进行登录,登录成功后再次添加此监听
		}

		@Override
		public void reconnectionSuccessful() {
//ReconnectionManager自动重新登录成功时进行的操作
//在掉线时可能会退出群组,在自动重连之后不会重新加入之前加入的群组,需要在此重新加入群组
		}

	}




你可能感兴趣的:(android学习)