构建多端口服务器:Java

时间:2011-10-12 01:55:25

标签: java multithreading ports

我正在尝试使用线程构建一个多端口服务器。我还有一个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);
    }

}

我的问题基本上是这样的:从理论上讲,有人可以解释一下我应该从哪里开始吗?

2 个答案:

答案 0 :(得分:0)

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

当然,必须正确地同步对消息计数的访问,并且描述中没有提到服务器何时必须正常关闭才能关闭。

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

答案 1 :(得分:0)

有关详细信息,请参阅ThreadPoolExecutor。它会使你的服务器健壮。您可以根据自己的需求进行构建。如果您从未使用Executors,那根本不是问题。非常简单。你必须给它你需要处理的Runnable,在这种情况下,一旦你得到连接,然后与客户等的交互。你的大部分负荷将减少。