2012-05-31 13 views
10

Smackを使用して小さなXMPPクライアント/ボットを構築すると、かなり奇妙な動作が発生します。私はConnectionListenerとChatManagerListenerだけでなく、接続を設定します。これは非常にうまく動作し、私はポータブルデバイス上で動作している私のアプリケーションとチャットすることができます。Smack Client - 接続は中止されましたが、ユーザーはまだ「オンライン」です

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

その後、イーサネットケーブルを差し込むと、接続が常に生きているように見えることがあります。オフラインメッセージが処理され、前と同じように再びチャットできます。 私のクライアントが完全にアクセスできない、順序が狂っている他の時間は、すべてのリスナーがなくなったように思えます...しかし、哀愁は投げられません。

接続が確立された後にクライアントが再起動することが確実でないた​​め、クライアント全体が使用できなくなることは、非常に奇妙で制御できない動作です。

他の誰かがこのような問題を経験したことがありますか、起こっていないことについてのヒントはありますか?

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

答えて

8

2つの異なる効果がに記載されています。あなたの質問のタイトルに名前が付けられているものから始めましょう:サーバによってユーザはオンラインと想定されます。接続が突然であり、したがって汚れていても中止されたとしてもです。その理由は、XMPPスタンザ・ストリームのクリーンな終了がないため、サーバーがクライアントの切断をまだ認識していないからです。ほとんどのXMPPサーバーは、毎分pingでクライアントをチェックします。クライアントが応答しない場合は、切断されたとみなされ、オフラインで表示されます(そのJIDの最後に接続されたリソースの場合)。それはここでは起こらず、珍しくありません。時には長いタイムアウト(30分以上)が必要な場合があるためです。

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

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

最後のこと:TCP接続は、イーサネットケーブルが差し込まれていてもタイムアウトしても簡単に生き残ることができます。NAT、TCP、XMPPなど、OSIモデルのさまざまなレイヤにタイムアウトがあります。

+0

感謝を行っている、彼らは私を助けるかもしれない実現する必要があります、あなたの接続を終了するdisconnect()メソッドを使用しています。多分、私はもっと忍耐強くなり、ケーブルを再び差し込む前に1〜2分以上待つことになるでしょう。いずれにしても、時にはチューニングされていることがあり、時としてそうではないリスナーの問題は、まだまだ謎です。しかし私はそれについて別の質問をするつもりだと思う。 – signpainter

+2

私は、TCPのこの動作はバグではなく、ほんの一部の人が感謝するような素晴らしい機能だと付け加えたいと思います。再接続する必要はありません。非常に高価なXMPPストリームのセットアップは、多くのラウンドトリップを節約します。 OSが接続の喪失と再開についてあなたに伝えて、接続が生き残っているかどうかを確認できるようにしてください。もしそうなら、まったく何も起こらないかのように走り、そうでなければ再接続します。 XEP-0198再接続も素晴らしいです。 – Zash

0

あなたはあまりにも明示的にサーバが定期的にあなたにpingを実行し、明確化のためにオフライン

関連する問題