メッセージの受信
XMPPでメッセージを受信するソースコードを見てみましょう。
XMPPService xmpp = XMPPServiceFactory.getXMPPService(); // (1) Message message = xmpp.parseMessage(request); // (2) String id = "[FROM]" + message.getFromJid(); // (3) String msgBody = "[BODY]" + message.getBody(); // (4)
大まかな、XMPPで受信したメッセージの処理方法は以下の通りです。
- XMPPServiceのインスタンス取得
- HttpServletRequestからメッセージ情報を取得
- 送信者の取得
- メッセージ本文の取得
次節から、具体的にサンプルプログラムを作成して検証していきます。
メッセージ受信プログラムの実装
プロジェクトの作成
まずは、以下の設定でApp Engineのプロジェクトを作成してください。今回はGWTを利用しませんので、Use Google Web Toolkitのチェックはハズして下さい(第2回の解説を参照して下さい)。また、日本語(2バイトコード)を扱いたいので、言語設定を必ず[UTF-8]に設定してください。
| Project name | XmppReceiver |
| Package | com.daisukeyamashita.test.xmppreceiver |
プログラムの作成
プログラムは、サーバーで受信したメッセージを送信元に送り返す機能を実装します。
package com.daisukeyamashita.test.xmppreceiver;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.xmpp.JID;
import com.google.appengine.api.xmpp.Message;
import com.google.appengine.api.xmpp.MessageBuilder;
import com.google.appengine.api.xmpp.SendResponse;
import com.google.appengine.api.xmpp.XMPPService;
import com.google.appengine.api.xmpp.XMPPServiceFactory;
@SuppressWarnings("serial")
public class XmppReceiverServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
request.setCharacterEncoding("UTF-8");
XMPPService xmpp = XMPPServiceFactory.getXMPPService();
Message message = xmpp.parseMessage(request);
JID jid = message.getFromJid();
Message msg = new MessageBuilder().withRecipientJids(jid).withBody(
message.getBody()).build();
SendResponse status = xmpp.sendMessage(msg);
boolean messageSent = (status.getStatusMap().get(jid) == SendResponse.Status.SUCCESS);
if (!messageSent) {
System.err.println("メッセージの送信に失敗しました:" + jid);
}
}
}
[war/WEB-INF/appengine-web.xml]の一番下にある</appengine-web-app>の直前に以下の3行を挿入します。
<inbound-services>
<service>xmpp_message</service>
</inbound-services>
[war/WEB-INF/web.xml]の一番下にある</web-app>の直前に以下の3行を挿入します。
<servlet> <servlet-name>XmppReceiver</servlet-name> <servlet-class>com.daisukeyamashita.test.xmppreceiver.XmppReceiverServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>XmppReceiver</servlet-name> <url-pattern>/_ah/xmpp/message/chat/</url-pattern> </servlet-mapping>
メッセージ受信プログラムの実行
これまでの手順で、サーバーが受信したインスタントメッセージをクライアントに送りなおすプログラムが完成しました。
プログラムのデプロイが完了したら、クライアントソフトからサーバーにメッセージを送信します。

すると、以下のようにすぐに同じメッセージがサーバーから送られてきます。

まとめ
今回はXMPP Java APIを勉強しましたが、いかがでしたでしょうか? 今回の記事で、Google App EngineでXMPPを簡単に使えることが分かっていただけたかと思います。
サーバーのXMPP IDは、アプリケーションID@appspot.com以外に任意の文字列@アプリケーションID.appspotchat.comも利用することができます。ユーザごとにIDを分けたりすることができるので、アイディア次第で面白いことができると思います。興味のある方は、試してみてはいかがでしょうか?
