2012-05-02 13 views
1

ゲームサーバープロジェクトでイベントを使用する予定です。使用するデザインが何であるか不思議です。私の問題の良い例は見つからないので、私はここで尋ねています。複数のサーバーのイベントと共有クラス

これまで私が慣れていたサーバープロジェクトの構造はほぼ同じです。サーバーとクライアントの両方のクラスで使用されるログインサーバー、ワールド/チャネルサーバー、共有ライブラリがあります。すべての通信コードがここにあります。サーバーはサーバークラスから派生しています。クライアントクラスはソケットのラッパーです。着信データは解析され、パケットハンドラメソッドに渡されます。

今、クライアントがすべてのクライアントに接続して通知を受け取った場合、イベントを追加します。私が以前使用していたように、接続されたすべてのクライアントを反復処理する代わりに、接続するクライアントは、接続するクライアントから起動されるイベントハンドラを登録する必要があります。

私は最終的に自分の標準設計に問題を抱えています。どこでコールバックを入れますか?通常は、OnClientConnectsなどの新しいメソッドをクライアントクラスに作成してイベントに使用する必要があります。しかし、私のサーバーは同じクライアントクラスを使用しており、両方のイベントハンドラをそこに置くことは汚いようです。このメソッドは、ソケットのようにsubcscripedクライアントからの情報を必要とするため、別の場所に置くことはできません。

私の頭に浮かんでいる唯一の解決策は、別々のクライアントクラス、または別のサーバー用の派生クラスです。私はカスタムクラスをそこで取得する必要があるので、これは少し難解ですが、共有クラス内のすべてのネットワークコードを使用していますが、オーバーライドされたメソッドを使用することは可能です。そして私はそれがすべて私ができることだと思う。

これらはすべてちょっと間違っていますが、これが本当に受け入れ可能なデザインなのか、それとももっと良い選択肢があるのか​​疑問です。

答えて

0

それはホワイトボードなしの質問の束を鮮明な画像を得るために少しトリッキーですが、それは任意の助けだ場合...

通常、私は、クライアントとサーバーの間で共有されているネットワーキング・ライブラリーを持っているでしょう。 ApplicationまたはFrameworkクラスには、構成の読み込み、さまざまなサブシステムの初期化(ロギング、スレッディングなど)を含む、クライアントとサーバーの両方に共通することが含まれる場合があります。 (多くの場合、サーバーへの共通だが、クライアントから分離されている機能があるので、おそらくさまざまなサーバのための中間クラスで)

その後、はい、私だろうは、クライアントとさまざまなサーバーの種類の派生を持っています。

具体的な質問にお答えするには、クライアントとサーバーの両方でコールバックを使用できるようにしてください。クライアントが接続するときにサーバーが何かをしたいと思うのはかなり妥当です。あなたが今それを必要としなくても、将来あなたが望むことができます。最低でも、サーバーはイベントをログファイルに記録できます。しかし、要点は、コールバックの処理は、client/genericServer/loginServer/worldServerの派生アプリケーションクラスに属していることです。

+0

あなたの答えをありがとう。しかし、connectイベントは単なる例であった。確かに、どちらもおそらくいずれかの時点で使用できるものですが、サーバーのうちの1つだけが使用しているユニークなイベント(多分)があります。 – Mars

+0

十分に良い。私は、これらのコールバックがその特定の派生サーバクラスに入るだけでよいと考えていました。 – pamphlet

+0

もう1つのアプローチは、よりメッセージ指向のアプローチをとることです。メモのイベントが発生したときに、メッセージオブジェクトをインスタンス化し、ヘッダーにメッセージタイプ(ペイロードを意識している場合はint)を持つTCPを介して関連するパーティにメッセージを送信し、メッセージファクトリを通して受信者にそれを実行させます受信者だけにローカルな「実装」バージョンを作成し、これがカスタムコードへのエントリポイントになります。これは私が大規模な商用プロジェクトで使用したアプローチです。それは「過度に複雑」なものもありますが、あなたは完全なコントロール(パフォーマンスを含む)を持っています。 – pamphlet

関連する問題