5

マルチプレイヤーオンラインゲームを開発しています。次の問題があります。

ユーザーがサーバーとの接続を切断すると、再接続する必要があります。最初の接続時、登録時に、登録モジュールは接続チャネルへの参照を保持する特別な ResponseDispatcher を生成します。ただし、ユーザーがログアウトすると、このチャネルは無効になります。問題を検出してリソースをクリーンアップすることはできますが、ユーザーが承認して再接続したときにチャネルを更新するために、登録モジュールへの参照とゲーム モジュールへの接続モジュールを保存する必要があります。これにより、モジュール間に多くの相互依存関係が生まれ、保守が非常に困難になります。

サーバーのすべてのモジュールからチャネルおよびセッション リソースへの参照を取得できるように、サーブレット コンテナーの HttpSession のようなものが必要です。

HttpSession はサーブレットにどのように実装されていますか? すべての JSESSIONID を格納するグローバル ハッシュマップであり、コンテナはどの属性マップを返すかを決定しますか? それがグローバル sysmbol テーブルである場合、パフォーマンスに影響しますか (hashMap の時間は O(1) ですが、セッションの変更がある可能性があるため、おそらく同期する必要があります)。

PS。この場合の設計パターンのいくつかの推奨事項も役立つかもしれません。

4

3 に答える 3

2

ファサードパターンをご覧ください

ここに画像の説明を入力

于 2013-10-24T07:36:15.157 に答える
2

質問が何であるか正確にはわかりません。「登録モジュールと接続モジュールへの参照を保存する必要がある」のはなぜですか?

とにかく、あなたの問題に対するすぐに賢明な解決策が2つあります。

1) 登録モジュールと接続モジュールをシングルトン化します。これが役立つかどうかは、これらのモジュールが提供する機能に完全に依存します。

2) 登録モジュールと接続モジュールを永続エンティティにして、それらをデータストアに保存し、必要な参照を完成させ、再接続時にそれらを取得して再構築します。

独自のセッション実装を展開する必要がある理由がよくわかりません。セッションがタイムアウトするとどうなりますか?

あなたのデザインはやや欠陥があるようです。接続が切断された場合、プレーヤーは「まだオンライン」であってはなりません (これは矛盾しています。ネットワークに接続していない場合、定義上、オンラインになることはできません)。意図的かどうかにかかわらず)、プレーヤーがタイムリーに再接続できるかどうかはわからないため、最悪の事態を想定する必要があります。さらに重要なことは、純粋なデザインの観点から、インターネット接続がゴミであるためにゲームに殺されることは、おそらく対処したくないことです. データの永続化にコストがかかる場合は、データストアのオプションを再検討する必要があります。また、オフライン中にサーバーがクラッシュした場合はどうなりますか?

于 2013-10-24T08:45:41.187 に答える