0

タイトルが示すように、クライアントがマルチスレッドを使用してサーバーに接続して接続を管理できるようにする小さなプロジェクトを実装しています。接続を制限したいのですが、サーバーがリクエストでいっぱいになった場合、他のクライアントをキューに入れる必要があります。たとえば、サーバーは同時に2つのクライアントのみがサーバーに接続できるようにし、他のクライアントは順番が来るまで接続することを許可します。

これは私のサーバークラスです

public class Server {

    static BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
    //Declare an instance of CommandParameter class

    static CommandParameter par;
    //Initialize a BufferedReader and BufferedWriter
    static BufferedReader bufferedReader;
    static BufferedWriter bufferWriter;
    //
    static int port;
    static String serverData;
    static int proc_count;
    private static String command;

    public static void main(String[] args) throws Exception {
        command = userInput.readLine();
        System.out.println("Server is available");
        //Thread.sleep(2000);
        processCommand(command);
        startServer(port);

    }

    public static void startServer(int port) {
        ServerSocket serverSocket = null;
        try {
            //create a port for server in order to listen incoming connections
            serverSocket = new ServerSocket(port);
            //allow client connect to server

        } catch (IOException e) {
            System.out.println(e);
        }
        while (true) {
            try {
                new ThreadSocket(serverSocket.accept(),serverData).start();

            } catch (IOException ex) {
                System.out.println("Server starts fail");
            }
        }
    }

    public static void processCommand(String input) {
        //assign the user input to an String array
        String inputLine = input;
        int commandCount = checkCommand(inputLine);
        if(commandCount>3 || commandCount ==-1){
            System.out.println("Invalid command");
            System.exit(1);
        }
        //assign the user input to an String array
        String[] command = inputLine.split(" ");
        par = new CommandParameter();

        //JCommander parses the command to get the pairs parameter name and value
        JCommander jc = new JCommander(par, command);
        port = par.getPort();
        serverData = par.getServerdata();
        proc_count = par.getProc_count();
    }
    public static int checkCommand(String inputLine) {
        int count = 0;
        if (inputLine.contains("-port")) {
            count++;
        }else if (inputLine.contains("-data")) {
            count++;
        } else if (inputLine.contains("-proc_count")) {
            count++;
        } else{
            return -1;
        }

        return count;
    }
}

何か案は?

4

2 に答える 2

1

これはまさに非同期IOが最も役立つ場所です。[限られた数のワーカースレッドで多数のIO要求を処理する必要があります]。最新のオペレーティングシステムのほとんどには、非同期IO操作を可能にするシステムコールがあります。たとえば、Linuxのepoll、Windows、AIX、SolarisのIOCP、BSDフレーバーのKQueue、MacOSなどです。Javaでは、ネイティブのノンブロッキング呼び出しは、さまざまなSPI(例)の背後で抽象化されます。sun.nio.ch.WindowsSelectorImpl、sun.nio.ch.KQueueSelectorImpl、sun.nio.ch.EPollSelectorImplなど。

Nettyを使用することをお勧めします。

少数の固定数のスレッドを使用して多数のHTTPリクエストを処理する例は、nettyAPIを使用した単純なタスクです。

1つのリスナースレッドと2つのワーカーを含むサンプルのブートストラップコードは次のようになります。

public static void setupHTTPListeners()
{
    ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newFixedThreadPool(1),
    Executors.newFixedThreadPool(2)));
    -----
    -----
}   

同じ文脈で、最も人気のある読み物の1つはここにあります-C10k問題

于 2013-03-09T17:14:33.750 に答える
0

backlog パラメータを使用ServerSocket(int port, int backlog);して、許可される接続の最大数を指定します。

于 2013-03-09T15:29:10.883 に答える