私のチャットアプリケーションでは、ユーザーがすでにログインしていて、同じユーザー名とパスワードを使用して他のデバイスに再度ログインしたい場合はいつでも、ユーザーにメッセージを戻す機能を実装したいと考えています-「あなたはすでに別の場所でログインしています」
ログイン状態を確認するこの方法しか知りません-
connection.isConnected();
しかし、これは私の目的を果たしません。
アレックスの答えは正しいですが、少し詳しく説明しましょう。
ログインに成功すると、XMPP-IM クライアントはプレゼンス スタンザをサーバーに送信します。次に、サーバーは、登録ステータスが「from」および「both」の名簿内のすべての JID の存在スタンザで応答します ( RFC6121 XMPP-IM 4.2.2および 4.4.2)。
セクション 4.4.2には、次のようにも記載されています。
The user's server MUST also send the presence stanza to all of the user's
available resources (including the resource that generated the presence
notification in the first place).
これは、JID の他のすべての接続リソースからプレゼンス情報を取得することを意味します。ここで別の完全な JID からプレゼンス スタンザを受信した場合、現在の接続で使用した場合、2 番目 (または 3 番目、...) のクライアントが JID に接続されていることがわかり、「他の場所で既にログインしています」と表示されます。 " メッセージ。
XMPP を使用する場合、これは実際にはやりたいことではないことに注意してください。同じ裸の JID を使用して同時に接続された複数のクライアントが XMPP-IM のコア機能であるためです。
smack をIterator<Presence> Roster.getPresences(String user)
使用する場合、プレゼンス情報を取得するために使用できます。呼び出しは次のようになりますgetPresences(XMPPConnection.getUser())
。(実際に動作するかどうかは確認していないことに注意してください)。
ログイン後、最初のプレゼンスを送信すると、他のすべてのリソース (デバイス) のプレゼンスが取得されます。したがって、すべての着信プレゼンスを確認すると、利用可能な接続がすべてわかります。