2011/01/02
GAE/J の Channel API を使ってみた。
あけましておめでとうございます。
お正月ですがこのブログはふつーに進行します。
GAE 1.4 で追加された Channel API を使って簡単なチャット
のサンプルを WSJS で書いてみた。
参考にしたのはオフシャルのページ。
http://code.google.com/intl/en/appengine/docs/java/channel/ 使い方は以外に簡単。 クライアント側:
index.html:
ChannelServer.rpjs:(サーバ側)
// import.
var MemcacheServiceFactory = Packages.com.google.appengine.api.memcache.MemcacheServiceFactory;
var ChannelServiceFactory = Packages.com.google.appengine.api.channel.ChannelServiceFactory;
var ChannelMessage = Packages.com.google.appengine.api.channel.ChannelMessage;
var CACHE_NS = "channel-test";
var ChannelServer = {
// クライアントIDから接続トークンを得る。
getToken : function(clientId) {
var clients = ChannelServer.getClients();
clients.add(clientId);
ChannelServer.saveClients(clients);
var channelService = ChannelServiceFactory.getChannelService();
var token = channelService.createChannel(clientId);
return token;
},
// 全員にメッセージを送る
sendMessageAll : function(msg) {
var channelService = ChannelServiceFactory.getChannelService();
var clients = ChannelServer.getClients();
var ite = clients.iterator();
while (ite.hasNext()) {
var clientId = ite.next();
channelService.sendMessage(new ChannelMessage(clientId, msg));
}
},
// クライアントの一覧をキャッシュに持つ。
getClients: function () {
var memcache = MemcacheServiceFactory.getMemcacheService(CACHE_NS);
var clients = memcache.get("clients");
if (clients == null) {
clients = new java.util.HashSet();
}
return clients;
},
saveClients : function(clients) {
var memcache = MemcacheServiceFactory.getMemcacheService(CACHE_NS);
memcache.put("clients", clients);
}
}
exports(ChannelServer);
実行してみる。
ChromeとFierfox で2つ開く。
これで一応チャットアプリっぽい動作をしている事になる。
疑問点:
socket.close() を呼んでも onclose が発生しない。 サーバ側にも明示的に接続を切るメソッドが無い。 はまり所:
一つだけはまった。
<script src='/_ah/channel/jsapi'> を <head>の中で呼ぶと JavaScript エラーになる。<body>の中で呼ぶ必要が有る。
http://code.google.com/intl/en/appengine/docs/java/channel/ 使い方は以外に簡単。 クライアント側:
- 一意のClientIDを送ってサーバからトークンを貰う。
- 専用APIにトークンを渡してサーバに接続する。
- goog.appengine.Channel
- メッセージ受信関数を専用APIに設定する。
- ClientIDを受け取ってトークンを返す。
同時にClientIDを保存する。
- ChannelService.createChannel()
- 何らかのイベントでクライアントにメッセージを送信する。
このとき 1. で保存した ClientID が必要。
- ChannelService.sendMessage()
index.html:
ClientId:


ClientID を其々 taro と hanako として接続する。


hanako が「こんにちは」と入力するとクライアントのアクション無し に taro 側にもメッセージが表示される。


taro 側で入力しても同じ。


socket.close() を呼んでも onclose が発生しない。 サーバ側にも明示的に接続を切るメソッドが無い。 はまり所:
一つだけはまった。
<script src='/_ah/channel/jsapi'> を <head>の中で呼ぶと JavaScript エラーになる。<body>の中で呼ぶ必要が有る。
Chrome: Uncaught TypeError: Cannot call method 'appendChild' of null Firefox: b is nullサンプルを動かす場合は こちら からどうぞ。
この投稿へのコメント

コメント・フォーム