サーバーからのメッセージ送信
Google トークのセットアップが完了したら、XMPPでメッセージを送信するソースコードを見てみましょう。
JID jid = new JID("xxxxx@gmail.com"); // (1) Message msg = new MessageBuilder().withRecipientJids(jid).withBody("メッセージ本文").build(); // (2) XMPPService xmpp = XMPPServiceFactory.getXMPPService(); // (3) SendResponse status = xmpp.sendMessage(msg); // (4)
大まかに次の流れでXMPPでメッセージ送信を行います。
- 送信先情報のインスタンスを生成
- メッセージ本文の作成
- XMPPServiceのインスタンス生成
- メッセージの送信
次節から、具体的にサンプルプログラムを作成して検証していきます。
メッセージ送信プログラムの実装
プロジェクトの作成
まずは、以下の設定でApp Engineのプロジェクトを作成してください。今回はGWTを利用しませんので、Use Google Web Toolkitのチェックは外して下さい(第2回の解説を参照して下さい)。また、日本語(2バイトコード)を扱いたいので、言語設定を必ず[UTF-8]に設定してください。
Project name | Xmpp |
Package | com.daisukeyamashita.test.xmpp |
プログラムの作成
プログラムは、ブラウザからGoogle App Engine上のプログラムにPOSTされたデータを、XMPPで「Google トーク」宛てにインスタントメッセージを送信する機能を実装します。
package com.daisukeyamashita.test.xmpp; 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 XmppServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); String to = request.getParameter("to"); String body = request.getParameter("body"); JID jid = new JID(to); Message msg = new MessageBuilder().withRecipientJids(jid) .withBody(body).build(); boolean messageSent = false; XMPPService xmpp = XMPPServiceFactory.getXMPPService(); if (!xmpp.getPresence(jid).isAvailable()) { response.getWriter().println("<h2>" + to + "は登録されていません。</h2>"); return; } SendResponse status = xmpp.sendMessage(msg); messageSent = (status.getStatusMap().get(jid) == SendResponse.Status.SUCCESS); if (!messageSent) { response.getWriter().println("<h2>メッセージの送信に失敗しました。</h2>"); return; } response.getWriter().println("<h2>メッセージを送信しました。</h2>"); } }
[war/index.html]を以下のように書き換えます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <form action="/xmpp" method="post"> <div>あて先:<input name="to"/></div> <textarea name="body" rows="2" cols="40" ></textarea> <div><input type="submit" value="送信" /></div> </form> </body> </html>