5

ejabberd XMPP サーバーと連携して動作する Android クライアントがあります。

所見:

  • シナリオ 1:アプリを右にスワイプ (アプリを強制終了) すると、ユーザーはサーバー上ですぐにオフラインになります。ステータスはその瞬間にオフラインに変更されます。

  • シナリオ 2:ただし、Android Jabber クライアントの Wi-fi 接続 (データ) を単純にシャットダウンすると、ユーザーがサーバー上でオフラインとしてマークされるまでに数分の顕著な遅延が生じます。

2 つのプロセスの根本的な違いは何かわかりません。

シナリオ 2 ですぐにオフラインにするにはどうすればよいですか?

4

1 に答える 1

2

シナリオ 1:アプリを右にスワイプ (アプリを強制終了) すると、ユーザーはサーバー上ですぐにオフラインになります。ステータスはその瞬間にオフラインに変更されます。

上記のケースでは、Android アプリケーションを閉じる前に、Android xmpp クライアントがプレゼンスを使用不可として送信しています。おそらく、Android XMPP クライアントは、アプリケーション onDestroy()メソッドを閉じるときに、XMPP サーバーへの永続的な XMPP 接続 (TCP ソケット) を維持するバックグラウンド サービスを維持しています。 of サービスが呼び出され、その中で XMPP 接続がまだ接続されているかどうかを確認できます。はいの場合は、プレゼンスを使用不可として送信します。これにより、ユーザーはサーバー上で安全にオフラインになり、XMPP 接続 (ソケット) が切断されます。

シナリオ 2:ただし、Android Jabber クライアントの Wi-fi 接続 (データ) を単純にシャットダウンすると、ユーザーがサーバー上でオフラインとしてマークされるまでに数分の顕著な遅延が生じます。

前述したように、Android デバイスはサービス内で持続的な XMPP 接続を維持できます。Wi-Fi をオフにしても、サーバーへの XMPP 接続 (TCP ソケット) がまだ接続されている場合、XMPP サーバーからユーザーを安全に削除することはできません [クライアントは'プレゼンスを使用不可として送信] は、接続がハングアップしただけで、Android クライアント/XMPP サーバーがそれを認識していないことを意味します。このような場合、サーバーは、クライアントが理想的な期間 [つまり、一定の間隔でソケットで通信がない] までにクライアントがハングアップしていることを認識し、ユーザーをオフラインにします。このプロセスには時間がかかるため、数分の遅れが見られます。

シナリオ 2 ですぐにオフラインにするにはどうすればよいですか?

XMPPサーバーを構成してクライアントを作成できます

この問題は XMPP クライアントとサーバーから処理できるため、クライアントから間隔時間の ping を固定できます。ping の持続時間を十分に短くしておくと、切断された接続 (ソケットのパイプの破損など) を検出できます。 inter [これはサーバーからクライアントへの ping であることを覚えておいてください] 小さな接続の損失を検出できます。

XMPP サーバーとして ejabberd を使用していることがわかります。このリンクに記載されている詳細は次のとおりです。

切断された接続を検出する方法は?

切断された接続を検出する 1 つの方法は、クライアントに定期的に ping を送信し、クライアントが応答しない場合は接続を切断することです。これは、mod_ping を使用して実行できます。ただし、これらの ping パケットはクライアントの無線を起動する可能性があるため、ping 間隔が短いとモバイル バッテリーが消耗する可能性があります。したがって、通常、数分未満の間隔を使用することはお勧めしません。いずれにせよ、メッセージが失われる可能性がある時間枠が常に存在します。

于 2015-05-20T11:44:40.357 に答える