0

マルチスレッド UDP クライアント サーバー ディクショナリを実装しています。正しく実装したと思いますが、適切にテストする方法がわかりません。誰か時間があれば、私のコードを簡単に見ていただけますか?

これは、通常、プログラムを実行する方法です。

java DictServer <port> <dictionary file name>
java DictClient localhost <port> <word to search>

これはサーバーの出力です (クライアントはここで 3 回実行されています)。

Server Started
Number of threads active: 1
Number of threads active: 2
Number of threads active: 3
Number of threads active: 4
Number of threads active: 5
Thread-0 just run.
Number of threads active: 5
Thread-1 just run.
Number of threads active: 5
Thread-3 just run.
Number of threads active: 5

ご覧のとおり、出力は問題ないようです。「ワーカープールモデル」であることを意図しているため、スレッド番号を最大 (5) に維持しています。ただし、UDP では、送受信されるパケットのみの「アクティブな接続」はありません。クライアントがパケットを取得すると、スレッドは閉じられます。これは非常に高速に発生するため、同時に接続している複数のクライアントを実際にテストすることはできません。助言がありますか?

また、セッターを使用してスレッド数を更新します。しかし、
「DictServer.decNumThreads()」を使用して呼び出していますが、これは悪いことですか?

私のコード:

サーバークラス:

public class DictServer {

private static int threads = 0;

public static void main(String args[]) throws IOException {

    // Connection Parameters
    DatagramSocket socket = null;
    int maxThreads = 5;             // Max threads at any time

    // Retrieve user input
    int serverPort = Integer.parseInt(args[0]);     // Convert string to int
    String dictionaryFile = args[1];

    try {
        // Setup socket
        socket = new DatagramSocket(serverPort);
        System.out.println("Server Started");

        while(true) {
            if(threads < maxThreads) {
                ServerThread server = new ServerThread(socket, dictionaryFile);
                new Thread(server).start();
                threads++;
                System.out.println("Number of threads active: " + threads);
            }               
        }
    }
    catch (Exception e) {
        System.out.println("Error: " + e.getMessage());
    }
    finally {
        if(socket != null) 
            socket.close();
    }
}

// Setter for number of active threads
public static void decNumThreads() {
    threads--;
}
}

スレッド クラス:

public class ServerThread implements Runnable {

private DatagramSocket socket = null;
private String dictionaryFile;

// Constructor
public ServerThread(DatagramSocket socket, String dictionaryFile) {
    this.socket = socket;
    this.dictionaryFile = dictionaryFile;
}

@Override
public void run() { 


    byte[] word = new byte[1000];
    byte[] definition = new byte[1000];

    try {
        // Get client request
        DatagramPacket request = new DatagramPacket(word, word.length);
        socket.receive(request);

        // Retrieve definition from dictionary file
        if(word != null) 
            definition = getDefinition(new String(word), dictionaryFile);

        // Put reply into packet, send packet to client
        DatagramPacket reply = new DatagramPacket(definition, definition.length, request.getAddress(), request.getPort());
        socket.send(reply);

    }
    catch (Exception e) {
        System.out.println("Error: " + e.getMessage());
    }

    System.out.println(Thread.currentThread().getName() + " just run.");
    DictServer.decNumThreads();
}
4

1 に答える 1

0

while (true)スレッドを作成する最初のループは無駄です。開始するスレッドの最大数に達すると、100% の使用率で CPU を焼き尽くしたままになります。

于 2012-08-12T10:04:06.207 に答える