OpenfireとSmackで学ぶXMPP利用方法

提供: omotenashi-mind
移動先: 案内検索

はじめに

XMPPの利用方法を学ぶためにはまずXMPPサーバーが必要です。
XMPP.JP」など外部公開されているXMPPサーバーを利用する方法もありますが、
ここでは自前でXMPPサーバーを立てるところから解説していきたいと思います。


サーバー編

XMPPサーバー「Openfire」とは

OpenfireとはApacheライセンスのXMPPサーバーです。
基本的なXMPPサービスに加え、豊富なプラグインも提供されています。Oracle Coherenceのライセンス料は別途掛かりますが、
hazelcast」が提供しているプラグインを利用すれば、クラスタリングを組むこと可能です。
DBもMySQL, Oracle, PostgreSQLなど様々なRDBのサポートはもちろん、HSQLにも対応しているのでちょっとした検証に利用したい場合にも
気軽に環境構築することができるようになっています。

※補足
頑張り次第では標準サポートしていないDBを利用することもできるようです。
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/db-integration-guide.html

Openfire導入

Openfireは「公式サイト」からダウンロード可能です。
ただし、32bit版のみの公開となっているので64bitで利用したい場合は別途64bit環境でビルドする必要があります。
手順は至ってシンプルです。

1.gitもしくはsvnサーバーからOpenfireのソースコードを入手
(gitの場合)

git clone https://github.com/igniterealtime/Openfire.git


2.取得したソースコードのbuildフォルダ配下でantを実行してビルドを行う。

cd build
ant


3.ビルドが完了するとOpenfire/targetフォルダ配下に実行に必要なファイル一式が生成されるので、任意の場所に配置。

4.Openfireサービスの実行
binフォルダ配下にある起動用シェルを実行します。

./openfire.sh


5.起動が無事に完了すると、9090ポートでサービスが開始します。

Openfire設定

ブラウザで9090ポートにアクセスすると、Openfireの管理画面が開いて設定用ウィザードが表示されます。
ウィザードに従って設定を進めていくだけで設定が行えるようになっています。

設定が完了すると、管理サイトへのログイン画面が表示されるので、設定時に入力したパスワードでログインを行ってください。
(usernameはadminです。)
XMPP Image000.png

ログイン後は、管理サイトから新規ユーザの追加が行えるようになっていますので、テスト用のユーザーを作成してください。

クライアント編

XMPPクライアント「Spark」について

SparkはXMPPサーバーのサービスを利用できるGUIクライアントの一つです。
Openfireと同様、「公式サイト」からダウンロードしてインストールするだけで簡単に利用することが可能です。
プログラムでの接続確認をする前に、一度接続確認をしていきましょう。

SparkでのXMPPサーバーへの接続

Openfireを起動した状態で、Sparkを起動して作成したユーザーの名前とパスワードでログインして見てください。
次のように表示されれれば無事にログイン成功です。
XMPP Image001.png

SmackでのXMPPサーバー接続

それではいよいよ、プログラムによるXMPPサービスの利用について触れていきたいと思います。
ここではJavaライブラリとして提供されている「Smack」をベースに解説していきます。

Smarkを利用するためには以下のjarが必要となります。

  • smack-tcp

mavenを利用すると簡単です。pom.xmlに以下のように記述するか、smack-tcpで検索してダウンロードしてください。

<dependency>
	<groupId>org.igniterealtime.smack</groupId>
	<artifactId>smack-tcp</artifactId>
 	<version>4.0.6</version>
</dependency>


ライブラリの準備が終わったら、いよいよXMPPサーバーへの接続です。
Openfireを起動している状態で、以下のようなコードを記述して実行します。

ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);
config.setSecurityMode(SecurityMode.disabled);
XMPPTCPConnection connection = new XMPPTCPConnection(config);

connection.connect();

証明書設定を行っていない状態で、2行目のSecurityMode無効化を行わないとjavax.net.ssl.SSLHandshakeExceptionが発生して正常に接続ができません。
とりあえず接続して検証したいだけならSecurityを無効化して接続するようにしてください。

無事に接続できることを確認できたら、次は認証です。
connection.connect()処理の後に次のように記述するだけです。

connection.login("username", "password");

usernameとpasswordにはサーバ登録時のユーザ名とパスワードを設定してください。
無事認証までできれば、チャットの準備完了です。

Smackからのチャット送信

接続・認証まで成功したら、いよいよチャットメッセージの送信です。
チャットメッセージを送信するためには次のように記述します。

Chat chat = ChatManager.getInstanceFor(connection).createChat("userJID", new MessageListener() {
	@Override
	public void processMessage(Chat chat, Message message) {
		System.out.println("Received message:" + message);
	}
});
chat.sendMessage("Hello!");

ChatManager経由でチャットメッセージを送信したい相手を指定してChatオブジェクトを生成し、メッセージを送信する手順となります。
1つ注意が必要なのが、ChatManager#createChat()をコールするときに指定するメッセージ送信相手はユーザ名ではなくユーザJIDという点です。
ユーザJIDはメールアドレスと同様に「ユーザ名+ @ドメイン名」という表記になります。ドメイン名については、Openfireの管理サイトから確認できるのでそちらをご確認ください。

実際にプログラムから送信したメッセージをSparkで確認すると次のように表示されます。
XMPP Image002.png

Smackでのチャット受信

最後にSmackでのチャットメッセージの受信処理の実装です。

ChatManager.getInstanceFor(connection).addChatListener((newChat, createdLocally) -> {
		newChat.addMessageListener((chat, message) -> {
		System.out.println(message.getBody());
	});
});

新規メッセージの受信を行うためには、まずChatManager#addChatListener()で新規チャットの開始通知を受け取るリスナーを設定します。
新しいチャット要求が飛んでくるとリスナーがそのチャットを受け取るので、チャットに対してメッセージリスナーを設定してメッセージが送信されるのを待ちます。

これだけでチャットメッセージを受け取ることができるようになります。
試しにSparkからメッセージを送ってみてください。送ったメッセージがコンソール上に出力されることを確認できると思います。

※メッセージの待機中にメインスレッドが終了しないようにする対策は別途必要です。

さいごに

Smackを利用すれば、簡単にXMPPを利用したチャットシステムが簡単に実現できるようになっています。
その他にもXMPPで定義された様々な機能も利用できるようになっているので、ぜひご活用してみてください。

参考サイト