ゲームサーバープロジェクトでイベントを使用する予定です。使用するデザインが何であるか不思議です。私の問題の良い例は見つからないので、私はここで尋ねています。複数のサーバーのイベントと共有クラス
これまで私が慣れていたサーバープロジェクトの構造はほぼ同じです。サーバーとクライアントの両方のクラスで使用されるログインサーバー、ワールド/チャネルサーバー、共有ライブラリがあります。すべての通信コードがここにあります。サーバーはサーバークラスから派生しています。クライアントクラスはソケットのラッパーです。着信データは解析され、パケットハンドラメソッドに渡されます。
今、クライアントがすべてのクライアントに接続して通知を受け取った場合、イベントを追加します。私が以前使用していたように、接続されたすべてのクライアントを反復処理する代わりに、接続するクライアントは、接続するクライアントから起動されるイベントハンドラを登録する必要があります。
私は最終的に自分の標準設計に問題を抱えています。どこでコールバックを入れますか?通常は、OnClientConnectsなどの新しいメソッドをクライアントクラスに作成してイベントに使用する必要があります。しかし、私のサーバーは同じクライアントクラスを使用しており、両方のイベントハンドラをそこに置くことは汚いようです。このメソッドは、ソケットのようにsubcscripedクライアントからの情報を必要とするため、別の場所に置くことはできません。
私の頭に浮かんでいる唯一の解決策は、別々のクライアントクラス、または別のサーバー用の派生クラスです。私はカスタムクラスをそこで取得する必要があるので、これは少し難解ですが、共有クラス内のすべてのネットワークコードを使用していますが、オーバーライドされたメソッドを使用することは可能です。そして私はそれがすべて私ができることだと思う。
これらはすべてちょっと間違っていますが、これが本当に受け入れ可能なデザインなのか、それとももっと良い選択肢があるのか疑問です。
あなたの答えをありがとう。しかし、connectイベントは単なる例であった。確かに、どちらもおそらくいずれかの時点で使用できるものですが、サーバーのうちの1つだけが使用しているユニークなイベント(多分)があります。 – Mars
十分に良い。私は、これらのコールバックがその特定の派生サーバクラスに入るだけでよいと考えていました。 – pamphlet
もう1つのアプローチは、よりメッセージ指向のアプローチをとることです。メモのイベントが発生したときに、メッセージオブジェクトをインスタンス化し、ヘッダーにメッセージタイプ(ペイロードを意識している場合はint)を持つTCPを介して関連するパーティにメッセージを送信し、メッセージファクトリを通して受信者にそれを実行させます受信者だけにローカルな「実装」バージョンを作成し、これがカスタムコードへのエントリポイントになります。これは私が大規模な商用プロジェクトで使用したアプローチです。それは「過度に複雑」なものもありますが、あなたは完全なコントロール(パフォーマンスを含む)を持っています。 – pamphlet