Примеры Java - Реализация многопоточного серверного приложения на сокетах
В Java реализация многопоточной серверной программы может быть выполнена с помощьюServerSocketпрослушивания клиентских подключений. Всякий раз, когда подключается новый клиент, запускается новый поток для обработки этого подключения. Ниже приведён пример кода, демонстрирующий, как использовать Java Socket для реализации многопоточной серверной программы.
Код на стороне сервера
Сначала мы создаём серверную программу, которая прослушивает указанный порт и запускает новый поток для каждого клиентского подключения для обработки обмена данными.
файл MultiThreadedServer.java
Код на стороне клиента
Клиентский код используется для подключения к серверу и отправки сообщений. Вы можете создать несколько клиентов, чтобы проверить многопоточные возможности сервера.
Код файла Client.java:
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();
}
}
}
Выполнение шагов
-
Запустите серверную часть:
- Скомпилировать и запустить
MultiThreadedServerclass. - Сервер запустится и будет прослушивать клиентские подключения на указанном порту.
- Скомпилировать и запустить
-
Запустите клиент:
- Скомпилируйте и запустите несколько
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Другие расширения