4

我正在开发聊天应用程序并使用ejabberdsaas 版本作为它的 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 manger 来解决这个问题。

有没有其他更好的方法或者 ping manager 是唯一的选择?

4

4 回答 4

3

不断ping 聊天服务器,最好ConnectionListener()在smack 库中使用。你需要使用这样的东西:

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?
      }
    });
于 2018-04-20T09:19:43.023 回答
2

就在这里。解决之前的几点

  1. 使您的服务变得 STICKY,并带有前台通知,因为有必要在此之前或之后工作Build.VERSION_CODES.O
  2. 这个粘性服务,你应该在每次启动时启动,通过BOOT_COMPLETED意图操作并从接收器启动这个前台服务。
  3. 是的,现在它一直在那里,现在您可以随时检查您的连接
  4. 您可以google-volley用于建立连接,甚至可以使用它进行通信。
  5. 没有很好的文档,但我非常喜欢它,因为一旦成功添加了依赖项,它就可以完美地工作。
  6. 添加此依赖项需要时间,因为我说没有好的文档..

对于通讯:

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);

您只需ECHO "SUCCESS"使用 php(或您喜欢的任何服务器端语言)从服务器回复。作为响应检查是否SUCCESS存在,任何其他情况..,使用您喜欢的其他关键字。你可以handle Server response errors too。甚至您也可以在请求中从 android 进行通信 - 响应握手。但是你必须自己实现一些握手。

我希望,它有帮助...

于 2018-04-20T06:26:39.897 回答
2

与 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;
}

}
于 2018-08-17T09:58:00.987 回答
1

使用此处描述的ReconnectionManager类。

ReconnectionManager manager = ReconnectionManager.getInstanceFor(connection);
manager.enableAutomaticReconnection();

必要时会自动重新连接。

于 2018-08-09T19:18:39.283 回答