0

スレッドを使用してマルチポート サーバーを構築しようとしています。ClientManager クラスと Client クラスもあります。必要なのは、ユーザーがポートの範囲を入力することです...たとえば、ポート8000​​〜8010です。サーバーは、これらすべてのポートで接続をリッスンする必要があります。その後、ClientManager はポートの範囲を取得し、ポートごとに Client インスタンスを作成します。次にクライアントは、0 ~ 1 秒のランダムな間隔でサーバーにメッセージを送信します。クライアントから 100 件のメッセージが送信されると、クライアントは切断されます。サーバーは、受信したメッセージの数を 5 秒ごとに出力する必要があります。

これまでのところ、ポート範囲のユーザー入力を取得し、Runtime.exec() パラメーターを介して ClientManager に送信することができました。Server と ClientManager の現在のコードは次のとおりです。

import java.io.*;

public class Server{

    public static void main(String[] args){
        try{        
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader userInputReader = new BufferedReader(isr);
            String lowPortRange = null;
            String highPortRange = null;

            System.out.println("Enter low end of port range:");
            if((lowPortRange = userInputReader.readLine())!=null){
                System.out.println("Low Range: " + lowPortRange);
            }
            System.out.println("Enter high end of port range:");

            if((highPortRange = userInputReader.readLine()) != null){
                System.out.println("High Range: " + highPortRange);
            }


            int lowPort = Integer.parseInt(lowPortRange);
            int highPort = Integer.parseInt(highPortRange);
            int totalPorts = highPort - lowPort+1;

            System.out.println("Total ports: " + totalPorts);
            System.out.println("...Port numbers...");

            for(int port = lowPort; port<=highPort; port++){
                System.out.println(port);
            }

            System.out.println("Done!");
            System.out.println();

            Process p = Runtime.getRuntime().exec("java ClientManager " + lowPort + " " + highPort);  

            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
                    String line = null;  
                    while ((line = in.readLine()) != null) {  
                        System.out.println(line);  
                    }  
        }catch(IOException e){
            System.out.println("IOException!");
            e.printStackTrace();
        }
    }
}

import java.io.*;

public class ClientManager{
    private int lowPort;
    private int numPorts;

    public static void main(String[] args){
        System.out.println("ClientManager Started.");

        int firstPort = Integer.parseInt(args[0]);
        int lastPort = Integer.parseInt(args[1]);

        System.out.println("First Port: " + firstPort);
        System.out.println("Last Port: " + lastPort);
    }

}

私の質問は基本的にこれです: 誰かが理論的に、私がここからどこへ行くべきかを説明できますか?

4

2 に答える 2

0

詳細については、 ThreadPoolExecutorを参照してください。それはあなたのサーバーを頑強にします。そして、あなたはあなたの要求に合うようにそれを構築することができます。エグゼキュータを使用したことがない場合は、まったく問題ありません。とてもシンプルです。処理する必要のあるRunnableを指定する必要があります。この場合、接続を取得したら、クライアントとの対話などを行います。ほとんどの負荷が軽減されます。

于 2011-10-13T07:13:05.430 に答える
0

リッスンしているポートごとに 1 つの ServerSocket を作成する必要があります。クライアントが接続するまで accept() はブロックされるため、各 ServerSocket でリッスンするスレッドを 1 つ作成する必要があります。複数のクライアントが同時に特定のポートに接続されている可能性がある場合 (説明からはそのようには見えません)、クライアント接続ごとに 1 つのスレッドを作成する必要もあります。そして、5 秒ごとにメッセージ カウントを出力してゼロにするためにもう 1 つ - これはメイン スレッドである可能性があります。

もちろん、メッセージ カウントへのアクセスは適切に同期する必要があり、説明には、サーバーをいつシャットダウンする必要があるかについては言及されていません。

(補足: クライアントが接続されている間に新しい接続を受け入れないことは、「実際の」サーバーでは明らかに受け入れられません。クライアントが多数ある場合、クライアントごとに 1 つのスレッドはこれを回避するための最適な方法ではありません。)

于 2011-10-12T02:08:15.103 に答える