0

私のゲームでは、2 つのサーバー (ゲーム用に 1 つ、ログイン システム用に 1 つ) で実行しています。どちらも相互にやり取りする必要があり、場合によっては、他のサーバーの他の状態について質問することもあります。

この例では、ゲーム サーバーは、プレイヤーがログインしようとしているかどうかをログイン サーバーに尋ねます。

public boolean isLoggingIn(int accountId) {
//Form a packet to send.
int retVal = sendData();
return retVal > 0;
}

明らかに、ブール値以外の情報を返すことができるように int を使用します。

私の質問は、このモーダル スタイルのプログラミングを機能させるにはどうすればよいかということです。JFileChooser の getOpenDialog() 関数と同じように機能します。

また、複数のスレッドがこのメソッドを一度に呼び出すことができることにも言及する必要があります。

4

3 に答える 3

2

モーダルとは、1つを除くすべてのアクションをブロックしようとすることを意味すると思います。このスタイルはあなたを困らせることになるのではないかと強く思います。モーダルインタラクションはロックの一形態であるため、ハングアップや切断などに対してあまり耐性がありません。耐性を持たせるには、誰かがモードに入った後、それ以上何も起こらなかった場合のタイムアウトとクリーンアップコードが必要です。(つまり、ラップトップを閉じたり、ゲームがクラッシュしたり、ネットワークケーブルを抜いたりしました)。

もし私があなたなら、代わりに認証と承認の観点から物事を考えようとします。

于 2012-08-24T19:41:56.850 に答える
0

その後に他のリクエストを処理することになっているスレッドでこのようなものを使用すると、ゲーム サーバーとログイン サーバー間のレイテンシが高い場合、戻り値をブロックしている間にすべてのリクエストがハングアップします。確かに、代わりに必要なのは、スレッドが応答を待っている間に他の要求を処理できるようにするためのコールバックです。

値を受け取るまでスレッドの実行を停止する理由がわかりません。その後の操作の値が必要な場合は、コールバックで「モーダル」にしたい呼び出しの後にあるすべてのコードをコピーするだけです。応答を待っている間に複数の要求を送信することが予想される場合は、応答者が応答に含めることができる一意の「responseId」を要求者側から送信します。Runnables を値として持つ Map のキーとして「responseId」を使用します。応答を受信したら、マップで remove を responseId キーを使用して呼び出し、返された Runnable 値で run() を呼び出します。MINA は非同期であると想定されており、応答パケットをブロックするべきではありません。

すべてを同じスレッドで処理したいという本当に正当な理由がある場合は、java.util.concurrent パッケージを調べることができます。カウント 1 の CountDownLatch を使用して実装し、要求メッセージを送信した後に await() を呼び出し、MINA からの応答を受信したときに countDown() を呼び出します。AtomicReference または長さ 1 の配列を使用して、待機中のスレッドに読み戻すことができる応答で受け取った値を保持する必要があります。

PS、あなたはまだメイプルストーリーの仕事をしていますか?

于 2012-08-24T20:15:45.023 に答える
0

簡単な答え-両方のサーバーでメソッドをRMI対応として公開し、説明したようにメソッドを呼び出すだけです。

公式の Oracle RMI チュートリアルを確認すると役立つ場合があります: http://docs.oracle.com/javase/tutorial/rmi/index.html

あなたのデザインは間違っているかもしれませんが、それはあなたのデザインです。;)

また、Spring Security を見る価値があります: http://static.springsource.org/spring-security/site/

于 2012-08-24T20:20:00.643 に答える