@Ragnar0k
Енотик

Параллельная обработка запросов клиент-сервера java?

Есть самый простой клиент-сервер, можно подключиться к серверу и из клиента посылать сообщения, сервер возвращает посланное сообщение назад.

Загвоздка в том, что он является последовательным, иными словами сокет занят одним клиентом и остальные должны дождаться окончания. На форумах нет примеров с обработкой нескольких клиентов одновременно, использующих библиотеку concurrent.

Привожу код клиента и сервера:

Server:

public class Server {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int port = 6666; //мой некий порт
        try {
            ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
            System.out.println("Ожидание клиента");

            Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
            System.out.println("Клиент подключился");
            System.out.println();

            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту. 
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();

            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout) {
            };

            String line = null;
            while (true) {
                line = in.readUTF(); // ожидаем пока клиент пришлет строку текста.
                System.out.println("От клиента я получил следующую строку : " + line);
                System.out.println("Отправляю обратно...");
                out.writeUTF(line); // отсылаем клиенту обратно ту самую строку текста.
                out.flush(); // заставляем поток закончить передачу данных.
                System.out.println("Жду следующую строку...");
                System.out.println();
            }
        } catch (Exception x) {
            x.printStackTrace();
        }
    }
}


Client:

public class Client {


    public static void main(String[] args) {
       int serverPort = 6666; // порт к серверу, которому хотим присоединиться
        String address = "127.0.0.1"; // это IP-адрес компьютера, где исполняется наша серверная программа. 
                                      // Здесь указан адрес того самого компьютера где будет исполняться и клиент.

        try {
            InetAddress ipAddress = InetAddress.getByName(address); // создаем объект который отображает вышеописанный IP-адрес.
            System.out.println("Если ли кто-то, подключенный по этому адресу " + address + " и порту " + serverPort + "?");
            Socket socket = new Socket(ipAddress, serverPort); // создаем сокет используя IP-адрес и порт сервера.
            System.out.println("Соединение установлено.");

            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиентом. 
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();

            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout);

            // Создаем поток для чтения с клавиатуры.
            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            System.out.println("Введите что-нибудь, это будет отправлено на сервер и возвращено им.");
            System.out.println();

            while (true) {
                line = keyboard.readLine(); // ждем пока пользователь введет что-то и нажмет кнопку Enter.
                System.out.println("Отправляем строку на сервер...");
                out.writeUTF(line); // отсылаем введенную строку текста серверу.
                out.flush(); // заставляем поток закончить передачу данных.
                line = in.readUTF(); // ждем пока сервер отошлет строку текста.
                System.out.println("Сервер прислал ответ : " + line);
                System.out.println("Введите следующую строку...");
                System.out.println();
            }
        } catch (Exception x) {
            x.printStackTrace();
        }    }

}

Каким образом сделать асинхронную обработку каждого клиента?И как вообще запустить несколько клиентов, по сути это просто 2 разных проекта в нетбинсе, и запуская сначала сервер, затем клиент - я запускаю два проекта, еще раз запустить клиент не получается. Кнопка серая.
  • Вопрос задан
  • 1716 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы