在 Android 中与 Xmpp 服务器保持活动连接的最佳方式
Best way to keepAlive Connection With Xmpp Server in Android
我正在开发聊天应用程序并使用 ejabberd
saas 版本作为它的 xmpp 服务器。我正在使用 smack 库 ver-4.2.3。为了保持连接,我正在使用 ping 管理器。这是我使用的代码:
ReconnectionManager.getInstanceFor(AppController.mXmpptcpConnection).enableAutomaticReconnection();
ServerPingWithAlarmManager.onCreate(context);
ServerPingWithAlarmManager.getInstanceFor(AppController.mXmpptcpConnection).setEnabled(true);
ReconnectionManager.setEnabledPerDefault(true);
//int i = 1;
// PingManager.setDefaultPingInterval(i);
PingManager.getInstanceFor(AppController.mXmpptcpConnection).setPingInterval(300);
我也在使用粘性服务进行连接,但是当我将我的应用程序保持打开状态(理想状态)15-20 分钟时,连接就会丢失,所以我正在使用 ping 管理器来解决这个问题。
有没有其他更好的方法,或者 ping 管理器是唯一的选择?
Yes, There is. Few points before the solution
- 通过前台通知使您的服务具有粘性,因为在
Build.VERSION_CODES.O
或之后需要工作
- 这个粘性服务,你应该在每次启动时启动,通过
BOOT_COMPLETED
intent 操作并从接收器启动这个前台服务。
- 是的,现在它总是在那里,现在您可以随时去检查您的连接
- 您可以使用
google-volley
建立联系,甚至可以使用它进行交流。
- 它没有很好的文档,但我非常喜欢它,因为一旦成功添加依赖项,它就可以完美地工作。
- 添加这个依赖项需要时间,因为我说没有好的文档..
交流用:
StringRequest stringRequest = new StringRequest(Request.Method.POST, "https://oniony-leg.000webhostapp.com/user_validation.php",
new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
serverKeyResponse = response;
// get full table entries from below toast and writedb LICENSETABLE
//Toast.makeText(getActivity(),response,Toast.LENGTH_LONG).show();
showKeyResponse();
// Log.d("XXXXXX XXXXX", "\n SUCCESS : "+serverKeyResponse);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
serverKeyResponse = error.toString();
// show below toast in alert dialog and it happens on slow internet try again after few minutes
// on ok exit app
// Toast.makeText(getActivity(),error.toString(),Toast.LENGTH_LONG).show();
showKeyResponse();
//Log.d("YYYYYY YYYYYY", "\n FAILURE : "+serverKeyResponse);
}
})
{
@Override
protected Map<String,String> getParams()
{
Map<String,String> params = new HashMap<String, String>();
params.put("INPUT",LicenseKey.getText().toString());
params.put("USER", MainActivity.deviceid);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
requestQueue.add(stringRequest);
您只需使用 php(或您喜欢的任何服务器端语言)从服务器回复 ECHO "SUCCESS"
。在响应中检查 SUCCESS
存在,任何其他情况..,使用您喜欢的其他关键字。你可以handle Server response errors too
。即使您可以在请求-响应握手中从 android 进行通信。但是你必须自己实现一些握手。
我希望,它有助于...
为了不断 ping 聊天服务器,你最好在 smack 库中使用 ConnectionListener()
。你需要使用这样的东西:
XMPPTCPConnection connection;
// initialize your connection
// handle the connection
connection.addConnectionListener(new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
}
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
}
@Override
public void connectionClosed() {
// when the connection is closed, try to reconnect to the server.
}
@Override
public void connectionClosedOnError(Exception e) {
// when the connection is closed, try to reconnect to the server.
}
@Override
public void reconnectionSuccessful() {
}
@Override
public void reconnectingIn(int seconds) {
}
@Override
public void reconnectionFailed(Exception e) {
// do something here, did you want to reconnect or send the error message?
}
});
使用 ReconnectionManager class as described here.
ReconnectionManager manager = ReconnectionManager.getInstanceFor(connection);
manager.enableAutomaticReconnection();
保持与 XMPP 服务器连接的最佳方式是在每次网络更改后重新连接。
像这样:
public class NetworkStateChangeReceiver extends BroadcastReceiver {
private Context context;
private static NetworkStateChangeListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
try {
if (!ApplicationHelper.isInternetOn(context)) {
if (mListener != null) {
mListener.OnInternetStateOff();
}
return;
} else {
XMPPTCPConnection xmpptcpConnection = XmppConnectionHelper.getConnection();
if(!StringHelper.isNullOrEmpty(new SessionManager(context).getAuthenticationToken())) {
Intent XmppConnectionServicesIntent = new Intent(context, XmppConnectionServices.class);
context.stopService(XmppConnectionServicesIntent);
context.startService(XmppConnectionServicesIntent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//to initialize NetworkStateChangeListener because null pointer exception occurred
public static void setNetworkStateChangeListener(NetworkStateChangeListener listener) {
mListener = listener;
}
}
我正在开发聊天应用程序并使用 ejabberd
saas 版本作为它的 xmpp 服务器。我正在使用 smack 库 ver-4.2.3。为了保持连接,我正在使用 ping 管理器。这是我使用的代码:
ReconnectionManager.getInstanceFor(AppController.mXmpptcpConnection).enableAutomaticReconnection();
ServerPingWithAlarmManager.onCreate(context);
ServerPingWithAlarmManager.getInstanceFor(AppController.mXmpptcpConnection).setEnabled(true);
ReconnectionManager.setEnabledPerDefault(true);
//int i = 1;
// PingManager.setDefaultPingInterval(i);
PingManager.getInstanceFor(AppController.mXmpptcpConnection).setPingInterval(300);
我也在使用粘性服务进行连接,但是当我将我的应用程序保持打开状态(理想状态)15-20 分钟时,连接就会丢失,所以我正在使用 ping 管理器来解决这个问题。
有没有其他更好的方法,或者 ping 管理器是唯一的选择?
Yes, There is. Few points before the solution
- 通过前台通知使您的服务具有粘性,因为在
Build.VERSION_CODES.O
或之后需要工作
- 这个粘性服务,你应该在每次启动时启动,通过
BOOT_COMPLETED
intent 操作并从接收器启动这个前台服务。 - 是的,现在它总是在那里,现在您可以随时去检查您的连接
- 您可以使用
google-volley
建立联系,甚至可以使用它进行交流。 - 它没有很好的文档,但我非常喜欢它,因为一旦成功添加依赖项,它就可以完美地工作。
- 添加这个依赖项需要时间,因为我说没有好的文档..
交流用:
StringRequest stringRequest = new StringRequest(Request.Method.POST, "https://oniony-leg.000webhostapp.com/user_validation.php",
new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
serverKeyResponse = response;
// get full table entries from below toast and writedb LICENSETABLE
//Toast.makeText(getActivity(),response,Toast.LENGTH_LONG).show();
showKeyResponse();
// Log.d("XXXXXX XXXXX", "\n SUCCESS : "+serverKeyResponse);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
serverKeyResponse = error.toString();
// show below toast in alert dialog and it happens on slow internet try again after few minutes
// on ok exit app
// Toast.makeText(getActivity(),error.toString(),Toast.LENGTH_LONG).show();
showKeyResponse();
//Log.d("YYYYYY YYYYYY", "\n FAILURE : "+serverKeyResponse);
}
})
{
@Override
protected Map<String,String> getParams()
{
Map<String,String> params = new HashMap<String, String>();
params.put("INPUT",LicenseKey.getText().toString());
params.put("USER", MainActivity.deviceid);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
requestQueue.add(stringRequest);
您只需使用 php(或您喜欢的任何服务器端语言)从服务器回复 ECHO "SUCCESS"
。在响应中检查 SUCCESS
存在,任何其他情况..,使用您喜欢的其他关键字。你可以handle Server response errors too
。即使您可以在请求-响应握手中从 android 进行通信。但是你必须自己实现一些握手。
我希望,它有助于...
为了不断 ping 聊天服务器,你最好在 smack 库中使用 ConnectionListener()
。你需要使用这样的东西:
XMPPTCPConnection connection;
// initialize your connection
// handle the connection
connection.addConnectionListener(new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
}
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
}
@Override
public void connectionClosed() {
// when the connection is closed, try to reconnect to the server.
}
@Override
public void connectionClosedOnError(Exception e) {
// when the connection is closed, try to reconnect to the server.
}
@Override
public void reconnectionSuccessful() {
}
@Override
public void reconnectingIn(int seconds) {
}
@Override
public void reconnectionFailed(Exception e) {
// do something here, did you want to reconnect or send the error message?
}
});
使用 ReconnectionManager class as described here.
ReconnectionManager manager = ReconnectionManager.getInstanceFor(connection);
manager.enableAutomaticReconnection();
保持与 XMPP 服务器连接的最佳方式是在每次网络更改后重新连接。
像这样:
public class NetworkStateChangeReceiver extends BroadcastReceiver {
private Context context;
private static NetworkStateChangeListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
try {
if (!ApplicationHelper.isInternetOn(context)) {
if (mListener != null) {
mListener.OnInternetStateOff();
}
return;
} else {
XMPPTCPConnection xmpptcpConnection = XmppConnectionHelper.getConnection();
if(!StringHelper.isNullOrEmpty(new SessionManager(context).getAuthenticationToken())) {
Intent XmppConnectionServicesIntent = new Intent(context, XmppConnectionServices.class);
context.stopService(XmppConnectionServicesIntent);
context.startService(XmppConnectionServicesIntent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//to initialize NetworkStateChangeListener because null pointer exception occurred
public static void setNetworkStateChangeListener(NetworkStateChangeListener listener) {
mListener = listener;
}
}