スポンサーリンク

XML-RPC Connection Proxy Architecture

Webでオンラインのゲームを作ろうと思い、色々、考えました。とりあえず、ゲーム自体は簡単なもので実装します。ゲームは、「じゃんけん」とします。

今回は、できるだけ、PHPとJavaScript(AJAX)でできないか、という方向で考えてみました。

トーナメント形式のゲームを考えます。参加人数によっては、シードがあったり、勝った人を他の勝った人と対戦させたりする必要があります。

接続をはりっぱなしにするか、そうでないか、で実装はかなり変わってきます。トーナメント情報の更新やステージを進めていく上で、コネクションを張ったほうが、実装上、楽だと思います。

コネクションを張るとなると、FlashでXML Socketを使ったり、Javaアプレットでコネクションを張ったり、Comet(コメット)で実装する方法があります。
Cometだと再接続の間のイベントのハンドリングが面倒です。
JavaアプレットだとJavaの知識が必要になります。


コネクションを張りっぱなしにするために、
  • Flash
  • Java Applet ということになり、Flashを利用することにしました。
XMLソケットサーバが必要になります。色々な言語で、実装されたサーバがありますが、今回は、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ソケットサーバは、コネクションとユーザのマップ情報を持っている必要があります。

下記が、このアーキテクチャの概要図になります。
Firefox
JavaScript 
 | ExternalInterface
SWF(Flash)
 | XML Socket
Java
 | HTTP
Apache + PHP - MySQL


基本的に、JavaScriptからPHPの間にある
  • Flash
  • XML Socket Server は、ただのブリッジになります。
ゲームの情報(イベントやトーナメント、勝負状況)を保持するためにPHPの後ろには、MySQLのDBを用意しています。

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の接続のユーザすべてに送信するデータになります。
PHPでロジックを書き、クライアントには、実行させたいJavaScript(主に画面の更新)を送信します。
イベントごとに、JavaScriptを用意しておくと楽でしょう。

このような、通信基盤(インフラストラクチャー)を用意することで、PHPとJavaScriptだけ解れば、簡単な通信アプリケーションであれば、実装できるようになると思います。XMLソケットサーバがどの程度のクライアント数まで対応できるのか、また、どのようにスケールさせるのか、が悩ましいところですが、今回は、そこまで考えませんでした。
じゃんけんというシンプルなトーナメントであれば、3万ぐらい、いけるんじゃないかな、って想像してますが、実際に試してないので、なんとも言えません。
とりあえず、作ってみて、4人で対戦(少ないー)している限りでは、問題ないです(当たり前)。

イベントの管理やユーザトリガではないイベントの発生などを色々考えなければならないこともあり、難しいです。

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 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

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー