0

たとえば、サーバーが一度に複数のクライアントにサービスを提供する Java のネットワーク プログラムがあり、各クライアントが ID を入力するだけで情報にアクセスできるとします。サーバーがクライアントのスレッドを開始する前に、クライアント プログラムの実行が開始されたときにユーザーが入力した ID が、現在実行中のスレッドによってまだ使用されていないこと、および特定の ID と一致することを確認する必要があります。パターン (たとえば 4 桁)。私がこれにアプローチした方法は、サーバークラスが何かを行う前に現在実行中のスレッドの ID の配列リストを宣言および初期化し、正規表現を使用して ID が 4 桁の長さであるかどうかを確認することです。次に、id が arraylist にあるかどうかを確認します。そうでない場合は、スレッドを開始できます。以下に示すコード:

   while(true)
  {
     ClientWorker w;
     try
     {
        w = new ClientWorker(server.accept());
        String validid = w.accountnumber;
        if(validid.matches("\\d[4]"))
        {
             if(!currentusers.contains(validid))
             {
                currentusers.add(validid);
                Thread t = new Thread(w);
                t.start();
             }
             else
             {
                 System.out.println("Already in session");
             }
        }
        else
        {
            System.out.println("not a valid id");
        }
 }

問題は、どちらの目的も達成されず、以前に動作していたプログラムにエラーが発生することです。入力した ID に関係なく、クライアントは問題なく続行し、どのトランザクションを実行したいかを尋ねてきます。次に、実際に何かを実行しようとすると、if ステートメントで正規表現を照合しようとしたり、メイン メソッドでクライアント ソケットに対応するポートをリッスンするようにサーバーに指示したりすると、サーバー プログラムがクラッシュし、null ポインター例外が発生します。問題は、スレッドが開始する前にクライアントのIDを取得する方法がわからないことだと思います。ユーザーがIDを入力して円を作成する前にスレッドを開始する必要があるように思われるからです。私が二乗しなければならないこと。誰でもこれで私を助けることができますか? PS:

4

1 に答える 1

0

アルゴリズムは次のようになります。

while (true)
    accept a new client
    start a thread to communicate with the client

そして、スレッドは次のことを行う必要があります。

read the ID sent by the client
check if it's valid and add it to a set of IDs if not already present
if invalid or already present
    send an error message to the client
    stop running
else 
    continue the conversation with the client. 
    once the conversation ends, in a finally block, remove the ID from the set of IDs

リストではなく HashSet を使用する必要があります。ルックアップ (O(1)) がはるかに高速であるためです。セットは複数のスレッドによってアクセスされるため、メソッドcheckIfIdPresentAndIfItDoesntThenAddTheId()とメソッドremoveId()が適切に同期されていることを確認する必要があります。

于 2012-12-08T23:20:18.857 に答える