libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

Channel APIによるクライアント=サーバー双方向通信 (3/5)

作成:2012-07-08 09:58
更新:2012-07-08 09:58

■チャンネルを使ったメッセージの送受信

では、いよいよチャンネルによる通信を行うための処理に進みましょう。これもやはりサーバー側とクライアント側それぞれで整理していきましょう。ただし! クライアント側の処理は、実は「goog.appengine.Channel」というチャンネル用のオブジェクトの開始と、メッセージ送受の2つの部分からなります。ですので、処理の順番に沿って、3つに分けて説明しましょう。


●クライアント側:チャンネル開始の処理

1. goog.appengine.Channelの作成
var channel = new goog.appengine.
        Channel( [トークン] );

まず、goog.appengine.Channelオブジェクトを作成します。これが、チャンネルを利用するためのJavaScriptオブジェクトになります。引数には、あらかじめ保存しておいたトークンを指定します。

2. Channelをオープンする
var socket = channel.open();
作成したgoog.appengine.Channelの「open」メソッドを呼び出し、チャンネルをオープンします。これでチャンネルを使った通信が開始されます。返り値は、「goog.appengine.Socket」というオブジェクトになります。これはソケットを使った通信を管理するものです。

3. Socketに各種イベントを設定する
socket.onopen = 開いた時の処理;
socket.onmessage = メッセージを受け取った時の処理;
socket.onerror = 例外時の処理;
socket.onclose = 開放時の処理;
返されたgoog.appengine.Socketオブジェクトに用意されている各種のイベント用プロパティに関数を設定します。これらは不要ならば設定しなくてもかまいませんが、最低限、「onmessage」だけは必要となるでしょう。これがないと、サーバーからのメッセージを受け取れませんから。


●サーバー側の処理

1. ChannelServiceインスタンスを取得する
ChannelService channelService = ChannelServiceFactory
                .getChannelService();
まずは、ChannelServiceFactory.getChannelServiceChannelServiceインスタンスを取得します。これは同じですね。

2. チャンネルキーを取得する
String channelKey = request.getParameter("channelKey");
続いて、クライアントからチャンネルキーを受け取ります。やはりchannelKeyというパラメータで送ってもらうことにして、これを取り出しておきます。同様に、クライアントから送られてくるメッセージなどがあれば受け取っておきます。

3. ChannelMessageの作成
ChannelMessage channelMsg = new ChannelMessage( [チャンネルキー] ,
         [メッセージ] );
ChannelMessageは、チャンネルにメッセージを送信するために用意するインスタンスです。引数には、送信するチャンネルのチャンネルキーと、送るメッセージ(String)を指定します。

4. ChannelMessageを送信する
channelService.sendMessage(channelMsg);
ChannelServiceの「sendMessage」を使い、作成したChannelMessageインスタンスを送信します。これでサーバーからクライアントへの送信は完了です。


●クライアント側:メッセージを送信・受信した時の処理
var xhr = new XMLHttpRequest();
xhr.open('POST', パス + '?channelKey=' + [チャンネルキー] + '&message=' +[メッセージ],
      true);
xhr.send();
チャンネルを利用してサーバーに送信するのは、比較的簡単です。XMLHttpRequestを使い、普通のAjax通信と同じようにして送信するだけですから。ただし、チャンネルキーと、送信するメッセージをきちんとパラメータとして用意しておくのを忘れないようにします。

通常のAjaxなら、送信後の処理はコールバック関数で用意しますが、チャンネルを使った場合は必要ありません。サーバーからの返信はチャンネルを通じてクライアントに送信がされ、goog.appengine.Channelオブジェクトのonmessageイベントが呼び出されるので、このイベントさえきちんとしておけばよいでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※クライアント側:チャンネルを開く

function openChannel() {
    channel = new goog.appengine.Channel([トークン]);
    socket = channel.open();
    socket.onopen = onOpened;     // 各イベント用の
    socket.onmessage = onMessage; // 関数を設定する
    socket.onerror = onError;
    socket.onclose = onClose;
}


※クライアント側:メッセージの送信

var xhr = new XMLHttpRequest();
xhr.open('POST', パス + '?channelKey=' + [チャンネルキー]  +
         '&message=' + [メッセージ], true);
xhr.send();


※クライアント側:メッセージを受信

var onMessage= function(param) {
    var 変数 = param.data;
    ……取得したメッセージを処理する……
};


※サーバー側:メッセージの送信

ChannelService channelService = ChannelServiceFactory
        .getChannelService();
String channelKey = request.getParameter("channelKey");
String message = request.getParameter("message");
channelService.sendMessage(new ChannelMessage(channelKey,
         [送信するメッセージ] ));
※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る