MUD/MUCK と考えてください。ただし、アバターやロケールのイラストを使用することもできます。私が選んだ言語はruby です。
サーバーとそのさまざまなクライアントの間で非同期に転送されるデータを使用して、複数の永続的な接続を処理する必要があります。クライアント セッションで発生するアクティビティに基づいて、1 つのデータベースを最新の状態に保つ必要があります。各クライアント セッションのアクティビティでは、他の複数のクライアントをすぐに更新する必要がある場合があります (ユーザーがルームに入る、ユーザーが別のユーザーにプライベート メッセージを送信する)。
これは目標プロジェクト であり、学習プロジェクトでもあるため、並行ネットワーク プログラミングについてさらに学習するために、車輪を 1 つか 2 つ再発明するつもりです。ただし、私は並行プログラミングとネットワーク プログラミングの両方に不慣れです。以前は、Web アプリでの非永続的な同期 HTTP 要求の世界でほぼ独占的に働いていました。ですから、正しい車輪を再発明していることを確認したいと思います。
embossの優れた回答に従って、特定の HTTP サーバーの内部を調べ始めました。これは、Web アプリは通常、問題がサーバー自体によって完全に抽象化されているため、スレッドの問題を回避できるためです。
私は EventMachine や GServer の機能をまだ理解していないので、使いたくありません。それらがどのように機能するか、どのような問題を解決し、なぜそれらが役立つのかについての一般的な感覚をつかむと、私はそれを快適に感じることができます. ここでの私の目標は、「ゲームを書く」ことではなく、「ゲームを書き、低レベルのもののいくつかがどのように機能するかを学ぶ」ことです。また、特定の用語の境界についても不明です。たとえば、「I/O 非バインド アプリ」は「イベント駆動型アプリ」のスーパーセットですか? 逆に?
もちろん、目標を達成するための正しい方法が存在する場合は興味がありますが、全体として、それが正しい方法である理由と、他の方法があまり好ましくない理由を理解したいと考えています。
書籍、電子書籍、オンライン リソース、サンプル プロジェクト、またはその他のちょっとした情報を提案してください。
私が現在行っている方法はIO#select
、接続されたソケットのリストをブロックするために使用し、タイムアウトは0.1秒です。読み取った情報をスレッドセーフな読み取りキューにプッシュし、タイムアウトになるたびに、スレッドセーフな書き込みキューからデータをプルします。タイムアウトを短くする必要があるかどうかはわかりません。ソケット処理スレッドの読み取りキューをポーリングし、「要求」を処理する 2 番目のスレッドがあります。これは、最初に動作させた方法よりも優れていますが、それでも理想的ではない可能性があります.
この質問を Hacker News に投稿したところ、私が取り組んでいるいくつかのリソースにリンクされました。似たようなものは何でも素晴らしいでしょう: