【问题标题】:Best way to keepAlive Connection With Xmpp Server in Android在 Android 中与 Xmpp 服务器保持活动连接的最佳方式
【发布时间】:2018-09-30 18:35:15
【问题描述】:

我正在开发聊天应用程序,并使用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 manager 是唯一的选择?

【问题讨论】:

标签: android xmpp chat smack ejabberd-saas


【解决方案1】:

如果经常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?
      }
    });

【讨论】:

    【解决方案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;
    }
    
    }
    

    【讨论】:

    • 以上代码用于重新连接服务器,要保持在线,请使用 Android 警报管理器或 Smack Ping 管理器,以便您可以将 Presence 发送到服务器
    • 感谢 Shavareppa,我使用了警报管理器而不是 Ping 管理器,它正在工作。但我在连接到服务器时丢失了消息
    【解决方案3】:

    是的,有。解决之前的几点

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

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

    希望对你有帮助...

    【讨论】:

    • 感谢您的快速回复!这怎么能取代ping管理器?我们必须保持与 Ejabberd XMPP 服务器的连接,而不是我们的服务器。在 smack 中,我们有 PingManager。
    【解决方案4】:

    使用ReconnectionManager 类,如here 所述。

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

    必要时会automatically re-connect

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2017-06-08
      相关资源
      最近更新 更多