0

我正在尝试使用线程构建多端口服务器。我还有一个 ClientManager 类和一个 Client 类。需要发生的是用户输入了一系列端口……比如说端口 8000-8010。服务器需要在所有这些端口上侦听连接。ClientManager 然后获取端口范围并为每个端口创建一个 Client 实例。然后客户端以 0-1 秒之间的随机间隔向服务器发送消息。客户端发送 100 条消息后,它应该断开连接。服务器需要每 5 秒打印出它收到了多少条消息。

到目前为止,我已经设法获取端口范围的用户输入,然后通过 Runtime.exec() 参数将它们发送到 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。它将使您的服务器健壮。您可以根据自己的需求对其进行构建。如果您从未与 Executors 合作过,那根本不是问题。很简单。你将不得不给它你需要处理的 Runnable,在这种情况下,一旦你获得连接,然后与客户端的交互等。你的大部分负载都会减少。

于 2011-10-13T07:13:05.430 回答
0

您需要为您正在侦听的每个端口创建一个 ServerSocket。因为accept() 在客户端连接之前一直阻塞,所以您需要创建一个线程来监听每个ServerSocket。如果多个客户端可能同时连接到给定端口(从您的描述中似乎不是这样),您还必须为每个客户端连接创建一个线程。每 5 秒打印一次并将消息计数归零 - 这也可能是主线程。

当然,对消息计数的访问必须正确同步,并且描述没有提到如果必须优雅地完成服务器应该何时关闭。

(旁注:在连接客户端时不接受新连接在“真实”服务器中显然是不可接受的,如果您有很多客户端,每个客户端一个线程并不是避免这种情况的最佳方法。)

于 2011-10-12T02:08:15.103 回答