1

Netty 上でオークション システムを開発しています。私が Netty を使用しているのは、Google で調べたところ、NIO は通常のソケット プログラミングよりもはるかに大きなクライアントを処理できることがわかったからです。

基本的に私は Netty のスターターです。チュートリアルとユーザーガイドについて説明しました。それだけです。したがって、私の質問が「問題」とみなされないかどうかを理解してください。以下は私のクライアントの疑似コードです。

public class AuctionClient
{
    private boolean loggedIn;

    public AuctionClient() //constructor

    ///
    .... // various functions
    ///

    public void run()
    {
        while (true)
        {
            int option = getUserOption(); //get user menu selection

            switch(option)
            {
                case 1:
                    login(); //user enters username and password. The info is converted into JSON string and sent to AuctionServer. 
                             //AuctionServer returns true if the info is correct, false otherwise
                    break;

                case 2:
                    startAuction(); //start a new auction
                    break;

                case 3:
                    makeBid(); //make a bid to an existing auction
                    break;

                case 4:
                    logout(); //log out from the AuctionServer
                    break;

                default:
                    break;
            }
        }
    }

    public static void main() // Creates AuctionClient class and runs it.
}

これが私がやろうとしていることの要点です。問題は、変数 loggedIn が true の場合にのみ、startAuction()、makeBid()、および logout() を有効にしたいということです。そのため、loggedIn の値を変更するには、ログインが成功したかどうかを知る必要があります。

しかし、login() の結果を処理するのは AuctionClientHandler (ここでは示されていますが) であるため、ログインが成功したかどうかを AuctionClient が知る方法はありません。

この問題を解決する優雅な方法はありますか。AuctionClient と AuctionClientHandler の間で情報を渡すために BlockingQueue を使用することは避けたいと思います。または、オークション システムのより良い設計はありますか?

どんな助けでも大歓迎です。

エドワード

4

2 に答える 2

1

あなたの問題は単純な事実に要約できると思います。前の操作の「状態」を保持する必要があります。このため、実装で毎回新しいハンドラーを作成する必要がありますPipelineFactory。たとえばpipeline.addLast('MyAuctionHandler',new AuctionHandlerClass());
、最初のログインが正常にLoginHandler行われたときに、 にある が特別なオブジェクトにpipelineメッセージを送信する必要があります。これを使用してフラグをに設定できます。コードの例として、私が公開したJava Game Serverを 見たいと思うかもしれません。同様のログイン、セッション管理なども処理します。これはログインを処理するハンドラーです。唯一の違いは、状態をセッションクラスに移動したため、このハンドラーがステートフルではないことです。AuctionClientHandlerlogintrue
LookupService

于 2012-09-16T20:17:58.083 に答える
0

もう 1 つの方法は、状態を添付ファイルとしてチャネルに保存することです。

Channel.setAttachment(..);
于 2012-09-17T04:59:48.907 に答える