« サンクリ 35 終了 | メイン | 開発環境アップグレードとか »

オンライン・スコアランキング実装メモ

TWilight INSanity で実装したオンライン・スコアランキングに関する技術メモ。


【開発・動作環境】
クライアント   : Windows + VisualStudio + C++ + WinSock
サーバ側アプリ : Java + JDBC
サーバ側 DB  : PostgreSQL
サーバOS    : Linux


【クライアント】
ゲーム本体です。実行ファイルです。
サーバへの接続するためのライブラリは、WinSock を使いました。マイクロソフトが今後はメンテナンス・アップデートしないと言ってるので、DirectPlay は使っちゃダメです。実際、WinSock が特別扱いづらいというわけではないので、DirectPlay を使う理由は無いと思います。プログラミングについては、Web 上の情報だけで充分でした。


【サーバ側アプリケーション】
クライアントおよびデータベースと通信するアプリケーションは Java で書きました。C 言語 + socket で書くよりは、セキュリティホールは圧倒的に減らせるかと。データベースと接続するために JDBC ドライバを入れる必要があります。開発環境は Windows + Eclipse。


【サーバ側データベース】
スコアデータを保存するデータベースは PostgreSQL で構築しました。どうも MySQL はライセンスが微妙な気がしたので(←詳しい人、教えてください)。これも、開発環境は Windows で全く問題なし。


【サーバ OS】
Linux を使いました。JDK の正式なサポートが欲しかったので BSD 系は遠慮しときました。ほんとは Solaris を使いたかったんだけどなあ。


【スコアランキング仕様】
クライアントプログラムは、サーバに接続する度に、自分の最高スコアをサーバに知らせます。最高スコアが更新された時だけサーバに知らせるのではないです。この動作によって、仮にサーバ側のデータが消失しても、その後全てのクライアントからの接続があれば、最終的にはサーバ側のデータが復旧することになります。

さらに、サーバ側は送られてきた得点が、(データベースに格納されている)そのクライアントの最高スコアでなければデータベースを更新しないようにします。これによって、クライアント側のデータが消失しても、サーバ側に最高スコアのデータが保持されることになります。


【Web ランキング】
こういうやつです。
Perl/PHP/Ruby などから直接 PostgreSQL に接続してもいいんですが、セキュアなプログラムを書く自信がなかったので、Java で書いたデーモンが一定間隔で、JSONP を吐くようにしました。同一ドメインなら XML でも可かと。


【その他メモ】
・トラフィックは案外少なかったです。
・どういう実装が良いのか試行錯誤中……。
・クライアントの識別情報に何を使うかは、ひとそれぞれかと。
・金髪双子姉妹にクラッキングされないように注意してるつもり。

トラックバック

このエントリーのトラックバックURL:
http://heppoko-net.jp/cgi-bin/mt/mt-tb.cgi/57

コメントを投稿