27

Android用のasmack-android-7-beemライブラリを使用しています。アプリが存続するなど、バックグラウンド サービスを実行しています。しかし、遅かれ早かれ XMPP 接続は予告なしに切断されます。サーバーは、クライアントがまだオンラインであると言っていますが、パケットは送受信されていません。

たとえば、他のクライアントが新しいプレゼンスを持っている場合、クライアントはプレゼンス パケットを受信しません。メインの Application クラスの属性として XMPPConnection があります。
接続する前に設定ConnectionConfiguration config.setReconnectionAllowed(true)しました。
しかし、再接続は起こりません。XMPPConnection connection.isConnected()true を返します。

そのため、クライアントは接続が実際に失われたことを認識していません。

接続を維持する方法はありますか?

4

6 に答える 6

12

asmack を使用する場合、アプリに次のようなコードを追加して、Dalvik に ReconnectionManager クラスをロードさせ、その静的初期化ブロックを実行させます。

static {
    try {
        Class.forName("org.jivesoftware.smack.ReconnectionManager");
    } catch (ClassNotFoundException ex) {
        // problem loading reconnection manager
    }
}
于 2012-12-24T13:37:14.223 に答える
8

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

                    }
                }); 

エラーが発生した場合、接続が閉じられたときに 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
                    }

次に、これが reconnectingin() メソッドを呼び出して再接続を試みることを確認します。

これがあなたを助けることを願っています。

以下のコードを使用して接続を確認します PingManager pingManager = PingManager.getInstanceFor(connection); pingManager.setPingInterval(5000);

isConnected メソッドは接続状態の確認に信頼性がないため、接続が接続されているかどうかを処理する ping 失敗処理の listner を追加します。

pingManager.registerPingFailedListener(PingFailedListener);

モバイル ネットワークの接続は非常に大きな問題であるため、ブロードキャスト レシーバーを使用してモバイルのネットワーク接続を確認する必要があります。データの再接続では、pingMyServer メソッドを使用して接続が有効かどうかを確認できます。サーバーから ping 応答を取得している場合は、接続が有効であることを意味します。それ以外の場合は、ping が失敗したときに手動で接続を再接続できます。

于 2014-04-26T06:10:28.517 に答える
2

私のプログラムがサーバー側のJVMで実行されることを除いて、私は同じ問題を抱えています。
そもそもsmack 4.0を使っていました。その後、smack 4.1 にアップデートしましたが、それでも問題が発生しました。最後に、構成モジュールを見つけました: PingManager
これを使用した後、この状況の発生はドロップダウンでした。

    connection = new XMPPTCPConnection(config);     
    PingManager pingManager = PingManager.getInstanceFor(connection);
    pingManager.setPingInterval(300); // seconds
于 2015-07-20T06:41:18.870 に答える