Примеры Java - Реализация многопоточного серверного приложения на сокетах

Примеры Java

В Java реализация многопоточной серверной программы может быть выполнена с помощьюServerSocketпрослушивания клиентских подключений. Всякий раз, когда подключается новый клиент, запускается новый поток для обработки этого подключения. Ниже приведён пример кода, демонстрирующий, как использовать Java Socket для реализации многопоточной серверной программы.

Код на стороне сервера

Сначала мы создаём серверную программу, которая прослушивает указанный порт и запускает новый поток для каждого клиентского подключения для обработки обмена данными.

файл MultiThreadedServer.java

import java.io.*; import java.net.*; public class MultiThreadedServer { public static void main(String[] args) { int port = 12345; //Определите порт сервера try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Сервер запущен, ожидание подключений клиентов..."); while (true) { Socket clientSocket = serverSocket.accept(); //Принять подключение клиента System.out.println("Клиент подключен:" + clientSocket.getInetAddress().getHostAddress()); //Запустить новый поток для каждого клиентского подключения ClientHandler clientHandler = new ClientHandler(clientSocket); new Thread(clientHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ClientHandler implements Runnable { private Socket clientSocket; public ClientHandler(Socket socket) { this.clientSocket = socket; } @Override public void run() { try ( InputStream input = clientSocket.getInputStream(); OutputStream output = clientSocket.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); PrintWriter writer = new PrintWriter(output, true) ) { String clientMessage; while ((clientMessage = reader.readLine()) != null) { System.out.println("Получено сообщение от клиента:" + clientMessage); writer.println("Ответ сервера:" + clientMessage); //Отправить ответное сообщение клиенту } } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

Код на стороне клиента

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

Код файла Client.java:

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        String serverAddress = "localhost";
        int port = 12345; // Порт сервера

        try (Socket socket = new Socket(serverAddress, port)) {
            System.out.println("Подключено к серверу");

            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));

            String userInput;
            while ((userInput = consoleReader.readLine()) != null) {
                writer.println(userInput);
                String serverResponse = reader.readLine();
                System.out.println("Ответ сервера: " + serverResponse);
            }
        } catch (UnknownHostException e) {
            System.err.println("Неизвестный хост: " + serverAddress);
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("Не удалось установить I/O-соединение с: " + serverAddress);
            e.printStackTrace();
        }
    }
}

Выполнение шагов

  1. Запустите серверную часть:

    • Скомпилировать и запуститьMultiThreadedServerclass.
    • Сервер запустится и будет прослушивать клиентские подключения на указанном порту.
  2. Запустите клиент:

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

Объяснение

  • ServerSocket: Сокет, используемый на стороне сервера для прослушивания подключений клиентов.
  • Socket: Канал связи между клиентом и сервером.
  • ClientHandler: Класс потока, который обрабатывает каждое подключение клиента.
  • BufferedReaderиPrintWriter: Используется для чтения и записи потоков данных.

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

Скомпилируйте код

Откройте терминал или командную строку, перейдите в каталог, содержащий указанный выше Java-файл, и скомпилируйте код:

javac MultiThreadedServer.java Client.java

После завершения компиляции сначала запустите серверную программу. Сервер запустится и начнёт прослушивать порт 12345.

java MultiThreadedServer

Вы увидите вывод сервера:

Server started, waiting for client connection...

Откройте другое окно терминала или командной строки и запустите клиентскую программу. Можно запустить несколько экземпляров клиента, чтобы протестировать многопоточную обработку.

java Client

Вы увидите вывод клиента:

Connected to server

Затем вы можете ввести сообщение в консоли клиента, например:

Hello Server

Сервер ответит:

服务器回应: Hello Server

Будет отображён вывод на стороне сервера:

客户端已连接: 127.0.0.1
收到客户端消息: Hello Server

Примеры Java

Другие расширения