您的位置:首页 > 移动开发 > Android开发

android 中 smack重新登录openfire服务器

2016-01-04 11:13 393 查看
一.利用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自动重新登录成功时进行的操作
//在掉线时可能会退出群组,在自动重连之后不会重新加入之前加入的群组,需要在此重新加入群组
}

}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: