Google App EngineとJavaでChannel APIを使用した三目並べ

この記事「 Channel API Overview(Java)」に基づいて、三目並べゲームでChannel APIを使用するストーリーを紹介します





HaberにはChannel APIに関する記事既にありましたが、 Pythonとチャットがあります。ここでは、tic tac toeとjavaのゲームがあります。 ゲームのソースはこちらです、ソースの著者は私ではありません。 問題が解決しない場合は、 問題3に記載されているとおりにします。



ご存じのとおり、Channel APIを使用すると、クライアント(Webページ、javascript)とGoogle App Engineの間に接続を確立できます。 ここで、知識のある人々は、これは現時点ではXMPPを介して機能すると言いますが、将来的にはWebSocketを使用することも可能になるでしょう。 三目並べの場合、これは、プレイヤーがポーリングを使用せずに相手の動きの結果を取得できることを意味します。 次のようにjavascriptライブラリを接続し、チャネルを作成できます(クライアント側):



<script src='/_ah/channel/jsapi'></script> //  js-api // token -    var channel = new goog.appengine.Channel(token); //    js-  var handler = { 'onopen': onOpened, //   'onmessage': onMessage, //    'onerror': function() {}, 'onclose': function() {} }; var socket = channel.open(handler);
      
      





このコードでは、トークンはチャネルの一意の識別子です(以降、トークンと呼びます)。 このゲームでは、サーバーによってWebページに直接書き込まれ、クライアントはすぐにそれを取得します。 トークンは、メソッド呼び出しを使用してサーバーによって生成されます
 String token = ChannelServiceFactory.getChannelService().createChannel(" ");
      
      



。 トークンの有効期限は2時間です。 この例では、ユーザーID(
 String userId = UserServiceFactory.getUserService().getCurrentUser().getUserId();
      
      



)およびゲームキー。これに応じて、ゲームオブジェクトは永続ストレージに保存されます。 入力すると、各ユーザーに対してゲームがすぐに作成され、そこでゲームキーを含むリンクを渡すことで別のプレーヤーを招待できます。 createChannelパラメーターは、utf-8( 問題3 )で表示される場合、64バイトよりも短くする必要があります。実際には、svnのソースに問題があるため、修正があります。



この例では3つのサーブレットを使用します。 TicTacToeServletは、ゲーム、ユーザー用のチャネルを作成し、Webページの本文に必要なすべてを書き込むことにより、すべての基本的な作業を行います。 クライアントが起動した後、OpenedServletはクライアントのリクエストに応答し、その側にチャネルを作成し、クライアントにゲームの現在の状態を提供します。 この場合のゲームはまだ開始されていないか、クライアントがゲーム中にページをリロードすると、最初のページとは異なる状態になります。 MoveServletは、移動に対する顧客の要求を受け取り、ゲームを更新します。 これには、Channel APIを使用したプレーヤーへの更新の送信が含まれます。 したがって、チャンネルAPIは、両方の参加者のゲーム状態を更新するために使用されます。



ここで興味深いのは、ゲームを保存するためのJDOの使用です。 おそらく、ゲームの保存にMemcacheを使用した方が良いでしょう。 競技場の作り方-キャンバスは使用されません。



また、Channel APIを使用して、クライアントの接続/切断をテストできます。 これを行うには、appengine-web.xmlを追加します。



 <inbound-services> <service>channel_presence</service> </inbound-services>
      
      





その後、クライアントは/ _ah /チャンネル/接続された/および/ _ah /チャンネル/切断された/のPOSTメッセージで接続と切断をそれぞれ行います。 次のようにサーバー側で接続を確認できます。

 ChannelServiceFactory.getChannelService(); ChannelPresence presence = channelService.parsePresence(req); String id = presence.clientId(); boolean connected = presence.isConnected();
      
      





サンプルを拡張し、接続されているプレーヤーのリストから対戦相手を選択する機能を追加することで使用できるもの



トークン-チャネルキーは秘密にされることが望ましい。 2時間後、有効期限が切れ、onerror()、onclose()ハンドラーがクライアントで機能します(チャネル作成コードを参照)。



この技術の欠点のうち、統合放送の欠如に注目する価値があります。 つまり 一般的なチャットを自分で行う必要があります。 また、1つのWebページで複数のフィードを作成することはできません。



サンプルのソースはこちらです。 SDKバージョン1.7を使用するには、追加する必要がありました
 <threadsafe>true</threadsafe>
      
      



appengine-web.xmlで。

また、チャンネルAPIを使用してGoogle App Engine / javaでチャットを作成する方法についても説明します: チュートリアル:コードラボ演習4:チャンネルAPI



All Articles