На этом шаге мы приведем третий пример сервера
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Server { public static void main(String[] args) throws IOException { // try с ресурсами, чтобы корректно закрыть потом сокет try (ServerSocket socket = new ServerSocket(Constants.PORT)) { System.out.println("Server started"); // Создаем очередь подключений ExecutorService executorService = Executors.newFixedThreadPool(4); // Пока сокет не закрыт while (!socket.isClosed()) { // Ждем подключения Socket client = socket.accept(); // Добавляем в очередь поток executorService.execute(new EchoThread(client)); } // Останавливаем очередь executorService.shutdown(); System.out.println("Server shutdown"); } } private static class EchoThread extends Thread { private Socket client; public EchoThread(Socket client) { this.client = client; setDaemon(true); } @Override public void run() { // Получаем адрес, с которого было произведено подключение String clientAddress = client.getInetAddress().getHostAddress(); System.out.println("Client " + clientAddress + " connected"); try { DataInputStream inputStream = new DataInputStream(client.getInputStream()); DataOutputStream outputStream = new DataOutputStream(client.getOutputStream()); while (true) { String text = inputStream.readUTF(); System.out.println("Client " + clientAddress + " sending: " + text); outputStream.writeUTF(text); outputStream.flush(); if (Constants.END_OF_WORK.equals(text)) { break; } } // Обязательно закрываем потоки inputStream.close(); outputStream.close(); // И обязательно закрываем клиентский сокет client.close(); } catch (IOException ignore) { // Когда клиент внезапно отсоединился, выводим сообщение System.out.println("Client " + clientAddress + " abort"); } } } }
Проект можно взять здесь
На следующем шаге мы начнем рассматривать еще один пример клиент-серверного приложения