Шаг 158.
Язык программирования Java.
Третий пример сервера

На этом шаге мы приведем третий пример сервера

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");
            }
        }
    }
}

Проект можно взять здесь

На следующем шаге мы начнем рассматривать еще один пример клиент-серверного приложения

Предыдущий шаг Содержание Следующий шаг