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

我为Android使用asmack-android-7-beem库。 我有一个后台服务正在运行,比如我的应用程序仍在运行。 但是,XMPP连接迟早会在没有任何通知的情况下死亡。 服务器表示客户端仍处于联机状态,但没有发送或接收数据包。

例如,当其他客户端有新的存在时,客户端不会收到任何存在数据包。 我有XMPPConnection作为我的主要应用程序类的属性。
在连接建立之前,我设置了ConnectionConfiguration config.setReconnectionAllowed(true)
但重新连接不会发生。 XMPPConnection connection.isConnected()返回true。

所以客户端并不知道连接实际上已经丢失。

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


当使用asmack在你的应用程序中放入一些类似的代码来使Dalvik加载ReconnectionManager类并运行它的静态初始化块时:

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

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

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

                    }
                }); 

如果发生任何错误,connectClosedOnError(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
                    }

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

希望这会帮助你。

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

添加列表程序ping失败处理来处理连接是否连接,因为isConnected方法对于连接的检查状态是不可靠的。

pingManager.registerPingFailedListener(PingFailedListener);

对于移动网络连接是一个非常大的问题,因此您需要使用广播接收器和数据重新连接来检查移动网络的连通性,您可以使用pingMyServer方法检查连接是否存活,如果您从服务器获取ping回复,则意味着连接处于活动状态否则在ping失败后,您可以手动重新连接连接。


我有同样的问题,除了我的程序在服务器端JVM上运行。
我首先使用了smack 4.0。 然后我更新了4.1,但问题仍然存在。 最后我找到了一个配置模块:PingManager
使用后,这种情况的发生是下降的。

    connection = new XMPPTCPConnection(config);     
    PingManager pingManager = PingManager.getInstanceFor(connection);
    pingManager.setPingInterval(300); // seconds
链接地址: http://www.djcxy.com/p/94081.html

上一篇: How to keep a XMPP connection stable on Android with (a)smack?

下一篇: HOsted XMPP Service with HTTP Developer APIs