メッセージの受信
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を分けたりすることができるので、アイディア次第で面白いことができると思います。興味のある方は、試してみてはいかがでしょうか?