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

