我正在使用openfire xmpp服务器和asmack库来实现pubub节点,我面临的最大问题是xmpp服务器的重新连接问题。
每当与xmpp服务器建立连接时,在桌面应用程序或Web应用程序中可能会有大量的节可能被交换,这似乎没问题,但对于3G链接非常弱的移动应用程序,如果交换这么多节,太好了。
我已经测试过,当wifi信号较弱或3g链接断开时,我正在重新连接到服务器(在后台进程中)但我主要得到响应超时错误并且如果连接花费太多时间获得成功。
我已经看过像whatsapp这样的信使,他们正在快速重新连接。我想做那样的事。
我已经读过关于pre-http绑定但是它存在于ejabber但是在openfire中没有找到任何东西而且htt-prebinding是匿名用户而我只使用注册用户。
所以任何人都可以告诉我如何快速重新连接到xmpp服务器。
代码段
Boolean onlyConnect = arg[0];
try {
if(xmpp!= null && !xmpp.isConnected())
xmpp.connect();
} catch(BOSHTimeoutException e){
Log.e("XConnection " , "Timeout occures");
// make a reconnection here
return false;
}
catch(ConnectionException e){
CatchErrors("ConnectionException" , "xmpp.connect()");
e.printStackTrace();
}catch(NoResponseException e){
CatchErrors("NoResponseException" , "xmpp.connect()");
// make a reconnection here
return false;
}catch (XMPPException e1) {
// TODO Auto-generated catch block
CatchErrors("XMPPException" , "xmpp.connect()");
e1.printStackTrace();
return false;
} catch (SmackException e) {
CatchErrors("SmackException" , "xmpp.connect()");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
CatchErrors("IOException" , "xmpp.connect()");
e.printStackTrace();
}
try {
Log.e("LOGIN REQUIRED " , "LOGIN IN");
xmpp.login(XMPP_USER_NAME, XMPP_PASSWORD, "sh");
} catch (XMPPException e) {
// TODO Auto-generated catch block
CatchErrors("XMPPException" , "xmpp.login()");
e.printStackTrace();
return false;
} catch(NoResponseException e){
Log.e("LOGIN REQUIRED " , "NoResponseException");
CatchErrors("NoResponseException" , "xmpp.login()");
//make a reconnection here
return false;
}catch (SaslException e) {
// TODO Auto-generated catch block
CatchErrors("SaslException" , "xmpp.login()");
e.printStackTrace();
} catch (SmackException e) {
// TODO Auto-generated catch block
CatchErrors("SmackException" , "xmpp.login()");
e.printStackTrace();
} catch (IOException e) {
CatchErrors("IOException" , "xmpp.login()");
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}