サーバーからのメッセージ送信
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>
