#java #serversocket
Вопрос:
Внутри моего серверного цикла я поставил условие, при котором сервер должен остановиться, но при вызове я получаю следующую ошибку: java.net.SocketException: An established connection was aborted by the software in your host machine
Я думаю, что происходит то, что серверы получают эту команду остановки, но в то же время параллельно ожидают другой команды из-за многопоточности, но когда команда остановки завершена, сервер закрывается, что вызывает ошибку для команды ожидания. Но обычно это должно заканчиваться на serverSocket.accept()
, вот почему я не понимаю, почему я получаю эту ошибку.
Наблюдения:
ServerCommand
является перечислениемServerCommand.Test
просто проверяет, работает ли сервер- Ошибка возникает в этой строке при запуске сервера:
ServerCommand serverCommand = (ServerCommand) dataIn.readObject();
- Сервер работает нормально при вызове теста
Проверка сервера:
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();
}
}