Создание многопортового сервера: Java - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь построить многопортовый сервер с потоками. У меня также есть класс ClientManager и класс Client. Что должно произойти, так это то, что пользователь вводит ряд портов ... скажем, порты 8000-8010. Сервер должен прослушивать все эти порты для соединений. Затем ClientManager получает диапазон портов и создает экземпляр Client для каждого из них. Затем Клиент отправляет сообщения на Сервер через произвольные интервалы от 0 до 1 секунды. После того, как клиент отправит 100 сообщений, он должен отключиться. Сервер должен распечатывать, сколько сообщений он получает каждые 5 секунд.

До сих пор мне удавалось получить пользовательские входные данные для диапазона портов, а затем отправить их в ClientManager с помощью параметров 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);
    }

}

Мой вопрос в основном таков: может ли кто-нибудь теоретически объяснить, куда я должен идти отсюда?

Ответы [ 2 ]

0 голосов
/ 13 октября 2011

См. ThreadPoolExecutor для получения дополнительной информации. Это сделает ваш сервер надежным. И вы можете структурировать его в соответствии с вашими требованиями. Если вы никогда не работали с исполнителями, это не проблема. очень просто. Вам нужно будет просто дать ему Runnable, который вам нужно обработать, в этом случае, как только вы получите соединение, затем взаимодействие с клиентом и т. Д. Большая часть вашей нагрузки уменьшится.

0 голосов
/ 12 октября 2011

Вам нужно создать один ServerSocket для каждого порта, который вы слушаете. Поскольку accept () блокируется до подключения клиента, вам нужно создать один поток для прослушивания каждого ServerSocket. Если к одному и тому же порту одновременно может быть подключено более одного клиента (это не так из вашего описания), вам также придется создать один поток для каждого клиентского соединения. И еще один, чтобы напечатать и обнулить счетчик сообщений каждые 5 секунд - это также может быть основной поток.

Конечно, доступ к количеству сообщений должен быть надлежащим образом синхронизирован, и в описании не упоминается, когда сервер должен завершить работу, если это вообще нужно сделать изящно.

(Sidenote: непринятие новых подключений, когда клиент подключен, явно неприемлемо на «реальном» сервере, и один поток на клиента не является оптимальным способом избежать этого, если у вас много клиентов.) *

...