11

小さな XMPP クライアント/ボットを構築するために smack を使用すると、非常に奇妙な動作が発生します。接続と、ConnectionListener および ChatManagerListener をセットアップしました。これは非常にうまく機能し、ポータブル デバイスで実行されているアプリケーションとチャットできます。

接続が失われたときの動作をテストするために、ポータブル デバイスのイーサネット ケーブルを抜きました。XMPP クライアントが接続を失い、ユーザーがユーザー仲間の名簿で「オフライン」に設定されることを期待していました。何が起こるかというと、このユーザーはまだ「オンライン」として表示されており、クライアントの ConnectionListener は、connectionClosed や reconnectionFailed などに関係なく、何も起動しません。

その後、イーサネット ケーブルを再び差し込むと、接続が常に有効になっているように見えることがあります。オフライン メッセージが処理され、以前のようにチャットできるようになりました。また、クライアントが完全にアクセスできず、故障していて、すべてのリスナーがなくなったように見えることもあります... しかし、例外はスローされません。

接続が中止された後にクライアントが再び起動するかどうかわからないため、これは非常に奇妙で制御不能な動作であり、クライアント全体が使用できなくなります。

他の誰かがそのような問題を経験したことがありますか、または何が起こっているか (何が起こっていないか) のヒントを持っていますか?

必要に応じてコードを提供できますが、実際には Smack のドキュメントからコピー & ペーストするだけです。

4

2 に答える 2

8

ここでは、実際には2つの異なる効果について説明しています。質問のタイトルに名前が付けられているものから始めましょう。接続が突然、したがってクリーンでない場合でも、ユーザーはサーバーによってオンラインであると見なされます。その理由は、XMPPスタンザストリームのクリーンな終了がなかったため、サーバーがクライアントの切断にまだ気付いていないためです。ほとんどのXMPPサーバーは、X分ごとにpingを実行してクライアントをチェックします。クライアントが応答しない場合は、切断されてオフラインで表示されていると見なされます(そのJIDの最後に接続されたリソースである場合)。それはここでは起こっておらず、珍しいことではありません。タイムアウトを長くしたい場合があるため(30分以上)。

同じことが反対側にも当てはまります。PingManagerまたはPingManagerWithAlarmManager(Androidの場合)が使用されている場合、SmackはX分ごとにXMPPpingも送信します。使用されているソケットに問題がある場合は、例外がスローされます。

私はあなたを正しい方向に向けることができることを願っています。自分の場合の例外で接続が終了しない理由を自分でデバッグする必要があります。

最後にもう1つ、イーサネットケーブルを抜いてから再度差し込んだ場合でも、TCP接続はある程度のタイムアウトに耐えることができます。関連するOSIモデルのさまざまなレイヤー(NAT、TCP、XMPPなど)には多くのタイムアウトがあります。

于 2012-05-31T20:11:28.333 に答える
0

メソッドを明示的に使用しdisconnect()て接続を終了しすぎました。そうしないと、サーバーは定期的に ping を送信し、オフラインになったことを認識する必要があります。

于 2012-06-04T07:02:16.250 に答える