Исключение SocketException соединение было прервано при закрытии ServerSocket в Java

#java #serversocket

Вопрос:

Внутри моего серверного цикла я поставил условие, при котором сервер должен остановиться, но при вызове я получаю следующую ошибку: java.net.SocketException: An established connection was aborted by the software in your host machine

Я думаю, что происходит то, что серверы получают эту команду остановки, но в то же время параллельно ожидают другой команды из-за многопоточности, но когда команда остановки завершена, сервер закрывается, что вызывает ошибку для команды ожидания. Но обычно это должно заканчиваться на serverSocket.accept() , вот почему я не понимаю, почему я получаю эту ошибку.

Наблюдения:

  1. ServerCommand является перечислением
  2. ServerCommand.Test просто проверяет, работает ли сервер
  3. Ошибка возникает в этой строке при запуске сервера: ServerCommand serverCommand = (ServerCommand) dataIn.readObject();
  4. Сервер работает нормально при вызове теста

Проверка сервера:

 Socket socket = new Socket("localhost", 40001);
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
dataOut.writeObject(ServerCommand.Test);
System.out.println(dataIn.readObject());
socket.close();
 

Остановить сервер:

 Socket socket = new Socket("localhost", 40001);
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
dataOut.writeObject(ServerCommand.Stop);
socket.close();
 

Запуск сервера:

 @Override
public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(40001);
        serverIsRunning = true;
        while (serverIsRunning) {
            Socket socket = serverSocket.accept();
            ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
            ServerCommand serverCommand = (ServerCommand) dataIn.readObject();
            switch (serverCommand) {
                case Stop: {
                    serverIsRunning = false;
                    break;
                }
                case Test: {
                    dataOut.writeObject(true);
                    break;
                }
            }
            socket.close();
        }
        serverSocket.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}