4

Android と iPhone の両方で XMPP クライアントを使用しています。サーバーに接続してメッセージを取得することもできました。

しかし、クライアントは数分後に XMPP サーバーとの接続を切断しています。IOS XMPP フレームワークは、クライアントがサーバーに接続されているかどうかを示すデリゲート メソッドで構成されています。接続が切断されていない場合は、デリゲート メソッドを使用して再接続できます。Android クライアント (私は aSmack ライブラリを使用しています) で次のコードを使用して、接続が存在するかどうかを確認しました。しかし、これは機能していないようです。

public void recieveMessage()
{  

           Log.e("xmppclient","will receive messages");
           PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
           connection.addPacketListener(new PacketListener() {

           public void processPacket(Packet packet) {
               if(connection != null && connection.isConnected()) 
               {
                   Message message = (Message) packet;
                   if (message.getBody() != null)
                        {
                   fromName = StringUtils.parseBareAddress(message.getFrom());
                   String messageBody=message.getBody();
                   Log.e("Message", messageBody );
                   Intent i = new Intent(NEW_MESSAGE);  
                   i.putExtra("username", StringUtils.parseBareAddress(message.getFrom()));
                   i.putExtra("message", message.getBody());
                   sendBroadcast(i);
                        }
                   else
                   {

                       connectToXmpp();
                   }
               }

            }

           }
   ,filter);
   }

connectToXMPP() は、新しい接続を開くメソッドです。

接続を確認して、接続が切れたらすぐに XMPP に再接続する方法はありますか??

4

4 に答える 4

6

上記のように、次のように接続リスナーをアタッチする必要があります。

Connection connection = (Connection)params[0];
connection.connect();

connection.addPacketListener(new PacketListener() {

                                 @Override
                                 public void processPacket(Packet packet) {
                                     System.out.println("Received message");
                                 }
                             }, new PacketFilter() {

                                 @Override
                                 public boolean accept(Packet packet) {
                                     System.out.println("Received message");
                                     return true;
                                 }
                             });

connection.addConnectionListener(new ConnectionListener() {
    @Override
    public void connectionClosed() {
        System.out.println("uhoh");
    }

    @Override
    public void connectionClosedOnError(Exception e) {
        System.out.println("uhoh");
    }

    @Override
    public void reconnectingIn(int i) {
        if(i < 4){
            //TODO notify
        }
    }

    @Override
    public void reconnectionSuccessful() {
        System.out.println("uhoh");
    }

    @Override
    public void reconnectionFailed(Exception e) {
        System.out.println("uhoh");
    }
});

connection.login("test2", "test");
于 2013-09-01T05:48:33.257 に答える
2

私はこの問題を自分で経験しましたが、今では問題を解決し、問題なく動作しています。

ここに解決策があります:-

  1. openfire サーバーに移動します。ログインします。
  2. 開いたら、[サーバー]タブをクリックします。
  3. サーバータブを開いた後、サブタブ、つまりサーバー設定を開きます
  4. SERVER SETTINGS を開いた後、左側の SERVER TO SERVER Settings をクリックします。
  5. これが 2 番目のオプション - IDLE CONNECTION SETTINGS です。
  6. オンに設定します - アイドル状態の接続を決して閉じないでください。

あなたの問題は解決されます。

于 2012-11-23T09:23:33.673 に答える
2

これは、接続でConnectionListenerを使用することで実現できるはずです。これにより、接続がいつ切断されたかを検出し、適切に処理することができます。

最初に処理しているパケットを受信するには、接続が開いている必要があるため、リストされたコードが else 条件にヒットすることはほとんどありません。

于 2011-05-20T17:05:33.113 に答える
0

再接続するときは、常に競合エラーを確認してください。これは、別のクライアントが現在のセッションと同じ完全な JID (local@domain/resource) でログインしたときに発生します。あなたはこれを得るでしょう:

<stream:error>
    <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
</stream:error>

エラーが発生した場合は決して自動再接続しないでください。そうしないと、恐ろしい「リソースの決闘」バグが発生します。また。他のすべての XMPP クライアント作成者と同様に。

于 2011-05-20T08:14:28.120 に答える