XML-RPC コネクションプロキシアーキテクチャ
スポンサーリンク
XML-RPC Connection Proxy Architecture
Webでオンラインのゲームを作ろうと思い、色々、考えました。とりあえず、ゲーム自体は簡単なもので実装します。ゲームは、「じゃんけん」とします。
今回は、できるだけ、PHPとJavaScript(AJAX)でできないか、という方向で考えてみました。
トーナメント形式のゲームを考えます。参加人数によっては、シードがあったり、勝った人を他の勝った人と対戦させたりする必要があります。
接続をはりっぱなしにするか、そうでないか、で実装はかなり変わってきます。トーナメント情報の更新やステージを進めていく上で、コネクションを張ったほうが、実装上、楽だと思います。
コネクションを張るとなると、FlashでXML Socketを使ったり、Javaアプレットでコネクションを張ったり、Comet(コメット)で実装する方法があります。
Cometだと再接続の間のイベントのハンドリングが面倒です。
JavaアプレットだとJavaの知識が必要になります。
コネクションを張りっぱなしにするために、
クライアント側からサーバへの通信
1. ユーザの操作によって、JavaScriptが起動され、イベントを発生する。
2. そのイベントは、Flashを通じて、XML ソケットサーバに送信する。
3. XML ソケットサーバは、Apache(PHP)に対して、HTTPでリクエスト送信する。
4. PHPでリクエストを処理し、レスポンスをXMLでXML ソケットサーバに返す。
5. XMLソケットサーバは、クライアント(Flash)にXMLを返す。
6. Flashは、XMLを受信し、JavaScriptに渡す。
7. JavaScriptは、受け取ったXMLからしかるべき処理をする。
1で発生したイベントに対して、JavaScriptでXMLを生成し、Flashに渡します。
4のPHPは、HTTP_RAW_POST_DATAでデータを受信します。
5では、XMLをパースし、XMLの内容に応じて、送るべき相手を判別し、データを送信できるように設計します。
だから、XMLソケットサーバは、コネクションとユーザのマップ情報を持っている必要があります。
下記が、このアーキテクチャの概要図になります。
基本的に、JavaScriptからPHPの間にある
JavaScriptとPHPは、XMLでデータのやりとりを行います。
PHPから発行するXMLの内容は、実行するJavaScriptのソースや挿入したいとhtmlを含めます。
クライアント(JavaScript)からのリクエストのXML
PHPからのレスポンスXML
イベントごとに、JavaScriptを用意しておくと楽でしょう。
このような、通信基盤(インフラストラクチャー)を用意することで、PHPとJavaScriptだけ解れば、簡単な通信アプリケーションであれば、実装できるようになると思います。XMLソケットサーバがどの程度のクライアント数まで対応できるのか、また、どのようにスケールさせるのか、が悩ましいところですが、今回は、そこまで考えませんでした。
じゃんけんというシンプルなトーナメントであれば、3万ぐらい、いけるんじゃないかな、って想像してますが、実際に試してないので、なんとも言えません。
とりあえず、作ってみて、4人で対戦(少ないー)している限りでは、問題ないです(当たり前)。
イベントの管理やユーザトリガではないイベントの発生などを色々考えなければならないこともあり、難しいです。
Webでオンラインのゲームを作ろうと思い、色々、考えました。とりあえず、ゲーム自体は簡単なもので実装します。ゲームは、「じゃんけん」とします。
今回は、できるだけ、PHPとJavaScript(AJAX)でできないか、という方向で考えてみました。
トーナメント形式のゲームを考えます。参加人数によっては、シードがあったり、勝った人を他の勝った人と対戦させたりする必要があります。
接続をはりっぱなしにするか、そうでないか、で実装はかなり変わってきます。トーナメント情報の更新やステージを進めていく上で、コネクションを張ったほうが、実装上、楽だと思います。
コネクションを張るとなると、FlashでXML Socketを使ったり、Javaアプレットでコネクションを張ったり、Comet(コメット)で実装する方法があります。
Cometだと再接続の間のイベントのハンドリングが面倒です。
JavaアプレットだとJavaの知識が必要になります。
コネクションを張りっぱなしにするために、
- Flash
- Java Applet ということになり、Flashを利用することにしました。
クライアント側からサーバへの通信
1. ユーザの操作によって、JavaScriptが起動され、イベントを発生する。
2. そのイベントは、Flashを通じて、XML ソケットサーバに送信する。
3. XML ソケットサーバは、Apache(PHP)に対して、HTTPでリクエスト送信する。
4. PHPでリクエストを処理し、レスポンスをXMLでXML ソケットサーバに返す。
5. XMLソケットサーバは、クライアント(Flash)にXMLを返す。
6. Flashは、XMLを受信し、JavaScriptに渡す。
7. JavaScriptは、受け取ったXMLからしかるべき処理をする。
1で発生したイベントに対して、JavaScriptでXMLを生成し、Flashに渡します。
4のPHPは、HTTP_RAW_POST_DATAでデータを受信します。
5では、XMLをパースし、XMLの内容に応じて、送るべき相手を判別し、データを送信できるように設計します。
だから、XMLソケットサーバは、コネクションとユーザのマップ情報を持っている必要があります。
下記が、このアーキテクチャの概要図になります。
Firefox JavaScript | ExternalInterface SWF(Flash) | XML Socket Java | HTTP Apache + PHP - MySQL
基本的に、JavaScriptからPHPの間にある
- Flash
- XML Socket Server は、ただのブリッジになります。
JavaScriptとPHPは、XMLでデータのやりとりを行います。
PHPから発行するXMLの内容は、実行するJavaScriptのソースや挿入したいとhtmlを含めます。
クライアント(JavaScript)からのリクエストのXML
<req> <event class="foo" method="bar> <param1>1234</param1> <param2>hoge</param2> </evetn> </req>
PHPからのレスポンスXML
<rsp> <user uid="abc"> <script type="text/javascript"><!CDATA[[ func(1,2,"hoge"); ]]></script> <html id="label1"><div>ほげほげ</div></html> </usr> <user uid="def"> <script type="text/javascript"><!CDATA[[ func(2,1,"neko"); ]]></script> <html id="label1"><div>ほげほげ2</div></html> </usr> <user uid="@@all" eventid="1"> <script type="text/javascript"><!CDATA[[ func2("New"); ]]></script> </usr> </rsp>
- uid="abc"は、abcさんにしか送らないデータになります。
- uid="def"は、abcさんにしか送らないデータになります。
- uid="@@all" eventid="1"は、event idが1の接続のユーザすべてに送信するデータになります。
イベントごとに、JavaScriptを用意しておくと楽でしょう。
このような、通信基盤(インフラストラクチャー)を用意することで、PHPとJavaScriptだけ解れば、簡単な通信アプリケーションであれば、実装できるようになると思います。XMLソケットサーバがどの程度のクライアント数まで対応できるのか、また、どのようにスケールさせるのか、が悩ましいところですが、今回は、そこまで考えませんでした。
じゃんけんというシンプルなトーナメントであれば、3万ぐらい、いけるんじゃないかな、って想像してますが、実際に試してないので、なんとも言えません。
とりあえず、作ってみて、4人で対戦(少ないー)している限りでは、問題ないです(当たり前)。
イベントの管理やユーザトリガではないイベントの発生などを色々考えなければならないこともあり、難しいです。
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12