如何在Android上保持XMPP连接稳定(a)smack?

Max*_*Max 26 connection android xmpp smack

我使用Android的asmack-android-7-beem库.我有一个后台服务正在运行,例如我的应用程序保持活动状态.但迟早XMPP连接会在没有任何通知的情况下死亡.服务器说客户端仍然在线,但没有发送或接收数据包.

例如,当其他客户端具有新的存在时,客户端不接收任何存在分组.我有XMPPConnection作为我的主要Application类的一个属性.
ConnectionConfiguration config.setReconnectionAllowed(true)在连接之前设置了.
但重新连接不会发生.XMPPConnection connection.isConnected()返回true.

因此客户端不知道连接实际上已丢失.

有没有办法保持连接活着?

小智 12

当使用asmack时,在你的应用程序中添加这样的代码,使Dalvik加载ReconnectionManager类并运行它的静态初始化块:

static {
    try {
        Class.forName("org.jivesoftware.smack.ReconnectionManager");
    } catch (ClassNotFoundException ex) {
        // problem loading reconnection manager
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Android上使用`ReconnectionManager`通常不是完整的解决方案,因为你想在数据连接改变时做出反应(例如GSM到Wifi切换),而`ReconnectionManager`不知道例如Android的`NETWORK_CONNECTIVITY_CHANGED`意图.此外,在Android上运行的较新的Smack版本(4.1或更高版本)上,不再需要手动进行初始化:Smack将自动完全初始化. (3认同)
  • 这样做的一些解释? (2认同)
  • @ingyesid这是在ReconnectionManager类中执行静态初始化块所必需的,它实际上激活了它.但是我会仔细检查,因为它应该由asmack statical初始化器初始化(如果你使用它). (2认同)

Man*_*eep 8

实际上重新连接管理器没有任何问题.首先,您需要将连接侦听器添加到连接管理器.

connection.addConnectionListener(new ConnectionListener() {

                    @Override
                    public void reconnectionSuccessful() {
                        Log.i("","Successfully reconnected to the XMPP server.");

                    }

                    @Override
                    public void reconnectionFailed(Exception arg0) {
                        Log.i("","Failed to reconnect to the XMPP server.");
                    }

                    @Override
                    public void reconnectingIn(int seconds) {
                        Log.i("","Reconnecting in " + seconds + " seconds.");
                    }

                    @Override
                    public void connectionClosedOnError(Exception arg0) {
                        Log.i("","Connection to XMPP server was lost.");
                    }

                    @Override
                    public void connectionClosed() {
                        Log.i("","XMPP connection was closed.");

                    }
                }); 
Run Code Online (Sandbox Code Playgroud)

如果发生任何错误,则在关闭连接时将自动调用connectionClosedOnError(Exception arg0)

 public void connectionClosed() {
                        Log.i("","XMPP connection was closed.");
                        //You can manually call reconnection code if you                  want to reconnect on any connection close
                    }
Run Code Online (Sandbox Code Playgroud)

然后检查它会调用reconnectingin()方法并尝试重新连接.

希望这对你有所帮助.

使用下面的代码进行检查连接 PingManager pingManager = PingManager.getInstanceFor(connection); pingManager.setPingInterval(5000);

添加用于ping失败处理的列表器以处理连接是否已连接,因为isConnected方法对于检查连接状态是不可靠的.

pingManager.registerPingFailedListener(PingFailedListener);

对于移动网络连接是一个非常大的问题,因此您需要使用广播接收器检查移动设备的网络连接,并且在数据重新连接时您可以使用pingMyServer方法检查连接是否存在,如果您从服务器获得ping回复,则表示连接处于活动状态否则在ping失败时您可以手动重新连接连接.