XMPP Smackクライアントのガイド

  • Java

  • link:/category/programming/ [プログラミング]

1. 前書き

https://xmpp.org/rfcs/rfc3921.html[XMPP]は、リッチで複雑なインスタントメッセージングプロトコルです。
このチュートリアルでは、独自のクライアントをゼロから作成する代わりに、Javaで記述されたモジュラーでポータブルなオープンソースXMPPクライアントであるSmackを見てみましょう。

2. 依存関係

  • Smackは柔軟性を高めるためにいくつかのモジュールとして編成されているため、必要な機能を簡単に組み込むことができます。

    これらのいくつかは次のとおりです。
  • XMPP over TCPモジュール

  • XMPPで定義された多くの拡張機能をサポートするモジュール
    標準財団

  • レガシー拡張機能のサポート

  • デバッグするモジュール

    サポートされているすべてのモジュールは、https://download.igniterealtime.org/smack/docs/latest/documentation/gettingstarted.html [XMPPのドキュメント]にあります。
    ただし、このチュートリアルでは、_tcp _、_ im_、_extensions_、および_java7_モジュールを使用します。
<dependency>
    <groupId>org.igniterealtime.smack</groupId>
    <artifactId>smack-tcp</artifactId>
</dependency>
<dependency>
    <groupId>org.igniterealtime.smack</groupId>
    <artifactId>smack-im</artifactId>
</dependency>
<dependency>
    <groupId>org.igniterealtime.smack</groupId>
    <artifactId>smack-extensions</artifactId>
</dependency>
<dependency>
    <groupId>org.igniterealtime.smack</groupId>
    <artifactId>smack-java7</artifactId>
</dependency>
最新バージョンはhttps://search.maven.org/search?q=g:org.igniterealtime.smack[Maven Central]にあります。

3. セットアップ

クライアントをテストするには、XMPPサーバーが必要です。 そのために、すべての人向けの無料のJabber / XMPPサービスであるhttps://jabber.hot-chilli.net [jabber.hot-chilli.net]にアカウントを作成します。
その後、__XMPPTCPConnectionConfiguration __classを使用してSmackを構成し、接続のパラメーターをセットアップするビルダーを提供します。
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
  .setUsernameAndPassword("baeldung","baeldung")
  .setXmppDomain("jabb3r.org")
  .setHost("jabb3r.org")
  .build();
*ビルダーにより、接続の実行に必要な基本情報を設定できます*。 必要に応じて、ポート、SSLプロトコル、タイムアウトなどの他のパラメーターも設定できます。

4. 接続

接続を確立するには、_XMPPTCPConnection_クラスを使用します。
AbstractXMPPConnection connection = new XMPPTCPConnection(config);
connection.connect(); //Establishes a connection to the server
connection.login(); //Logs in
このクラスには、以前に構築された構成を受け入れるコンストラクターが含まれています。 また、サーバーに接続してログインする方法も提供します。
*接続が確立されると、次のセクションで説明する_chat_などのSmackの機能を使用できます。
接続が突然中断された場合、デフォルトで「Smack」は再接続を試みます。
_https://download.igniterealtime.org/smack/docs/latest/javadoc/org/jivesoftware/smack/ReconnectionManager.html [ReconnectionManager] _は、サーバーへの再接続をすぐに試行し、連続する再接続の継続中に試行間の遅延を増加させます。失敗。

5. チャット

*ライブラリの主要な機能の1つは、チャットサポートです*。
_Chat_クラスを使用すると、2人のユーザー間でメッセージの新しいスレッドを作成できます。
ChatManager chatManager = ChatManager.getInstanceFor(connection);
EntityBareJid jid = JidCreate.entityBareFrom("[email protected]");
Chat chat = chatManager.chatWith(jid);
_Chat_を作成するために、_ChatManager_を使用し、明らかにチャット相手を指定したことに注意してください。 後者は、ローカルパート(_baeldung2_)とドメインパート(_jabb3r.org_)で構成されるXMPPアドレス(別名JID *)をラップする_EntityBareJid_オブジェクトを使用して実現しました。
その後、_send()_メソッドを使用してメッセージを送信できます。
chat.send("Hello!");
そして、リスナーを設定してメッセージを受信します。
chatManager.addIncomingListener(new IncomingChatMessageListener() {
  @Override
  public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {
      System.out.println("New message from " + from + ": " + message.getBody());
  }
});

* 5.1。 部屋*

エンドツーエンドのユーザーチャットと同様に、* Smackはルームを使用してグループチャットをサポートします*。
*インスタントルームと予約済みルームの2種類の部屋があります。*
インスタントルームはすぐにアクセスでき、デフォルトの構成に基づいて自動的に作成されます。 一方、予約済みの部屋は、誰でも入室を許可する前に、部屋の所有者が手動で設定します。
_MultiUserChatManager_を使用してインスタントルームを作成する方法を見てみましょう。
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
MultiUserChat muc = manager.getMultiUserChat(jid);
Resourcepart room = Resourcepart.from("baeldung_room");
muc.create(room).makeInstant();
同様の方法で、予約済みの部屋を作成できます。
Set<Jid> owners = JidUtil.jidSetFrom(
  new String[] { "[email protected]", "[email protected]" });

muc.create(room)
  .getConfigFormManger()
  .setRoomOwners(owners)
  .submitConfigurationForm();

6. 名簿

  • Smackが提供するもう1つの機能は、他のユーザーの存在を追跡できることです。*

    __Roster.getInstanceFor()を使用して、____Roster_インスタンスを取得できます。
Roster roster = Roster.getInstanceFor(connection);
  • Rosterは、ユーザーを_RosterEntry_オブジェクトとして表し、ユーザーをグループに整理できる連絡先リストです。*

    _getEntries()_メソッドを使用して、_Roster_のすべてのエントリを印刷できます。
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries) {
    System.out.println(entry);
}
さらに、エントリとプレゼンスデータの変更をa__RosterListener:_でリッスンできます。
roster.addRosterListener(new RosterListener() {
    public void entriesAdded(Collection<String> addresses) { // handle new entries }
    public void entriesDeleted(Collection<String> addresses) { // handle deleted entries }
    public void entriesUpdated(Collection<String> addresses) { // handle updated entries }
    public void presenceChanged(Presence presence) { // handle presence change }
});
また、承認されたユーザーのみが名簿に登録できるようにすることで、ユーザーのプライバシーを保護する方法も提供します。 *そのために、Smackは権限ベースのモデルを実装しています。*
presence_Roster.setSubscriptionMode()_メソッドを使用してプレゼンスサブスクリプション要求を処理するには、3つの方法があります。
  • Roster.SubscriptionMode.accept_all –すべてのサブスクリプションを受け入れる
    リクエスト

  • Roster.SubscriptionMode.reject_all –€_すべてのサブスクリプションを拒否する
    リクエスト

  • Roster.SubscriptionMode.manual –€プロセスプレゼンスサブスクリプション
    手動で要求する

    サブスクリプションリクエストを手動で処理する場合、_StanzaListener_(次のセクションで説明)を登録し、_Presence.Type.subscribe_タイプのパケットを処理する必要があります。

7. スタンザ

チャットに加えて、Smackはスタンザを送信し、着信を聞くための柔軟なフレームワークを提供します。
*明確にするために、a stanzaはXMPPの意味の離散的な意味単位です。 XMLストリームを介して1つのエンティティから別のエンティティに送信される構造化された情報です。*
_send()_メソッドを使用して、__ Connection __を介して_Stanza_を送信できます。
Stanza presence = new Presence(Presence.Type.subscribe);
connection.sendStanza(presence);
上記の例では、_Presence_ stanzaを送信して、名簿に登録しました。
一方、着信スタンザを処理するために、ライブラリには次の2つの構造が用意されています。
  • _StanzaCollector _

  • StanzaListener

    特に、* __ StanzaCollector __letは新しいスタンザを同期的に待機します*:
StanzaCollector collector
  = connection.createStanzaCollector(StanzaTypeFilter.MESSAGE);
Stanza stanza = collector.nextResult();
while * _StanzaListener_は、着信スタンザを非同期に通知するためのインターフェースです*:
connection.addAsyncStanzaListener(new StanzaListener() {
    public void processStanza(Stanza stanza)
      throws SmackException.NotConnectedException,InterruptedException,
        SmackException.NotLoggedInException {
            // handle stanza
        }
}, StanzaTypeFilter.MESSAGE);

* 7.1。 フィルター*

さらに、*ライブラリは、着信スタンザを処理するための組み込みのフィルタセットを提供します。*
_StanzaTypeFilter_を使用してタイプによって、または_StanzaIdFilter:_を使用してIDによってスタンザをフィルター処理できます。
StanzaFilter messageFilter = StanzaTypeFilter.MESSAGE;
StanzaFilter idFilter = new StanzaIdFilter("123456");
または、特定の住所で識別する:
StanzaFilter fromFilter
  = FromMatchesFilter.create(JidCreate.from("[email protected]"));
StanzaFilter toFilter
  = ToMatchesFilter.create(JidCreate.from("[email protected]"));
そして、論理フィルター演算子(_AndFilter _、_ OrFilter _、_ NotFilter_)を使用して、複雑なフィルターを作成できます。
StanzaFilter filter
  = new AndFilter(StanzaTypeFilter.Message, FromMatchesFilter.create("[email protected]"));

8. 結論

この記事では、Smackがすぐに提供する最も有用なクラスを取り上げました。
XMPPスタンザを送受信するためにライブラリを構成する方法を学びました。
その後、_ChatManager_および_Roster_機能を使用してグループチャットを処理する方法を学びました。
いつものように、このチュートリアルに示されているすべてのコードサンプルは、https://github.com/eugenp/tutorials/tree/master/libraries-server [GitHubで]から入手できます。