У меня есть простой TCP-сервер:
public class ServerSocketRunner {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9000);
while (true) {
Socket socket = serverSocket.accept();
new Thread(() -> {
System.out.println("New client connected");
try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));) {
String inputLine, outputLine;
do {
inputLine = in.readLine();
System.out.print("Received: " + inputLine);
String serverResponse = "Message Received: " + now();
System.out.println("Sending: " + serverResponse);
out.println(serverResponse);
} while (!"bye".equals(inputLine));
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
и клиент
public class ClientRunner {
public static void main(String[] args) throws Exception {
try (Socket socket = new Socket("localhost", 9000);
Scanner input = new Scanner(socket.getInputStream());
PrintWriter output = new PrintWriter(socket.getOutputStream(), true)) {
Scanner userEntry = new Scanner(System.in);
String message, response;
do {
System.out.print("Enter message: ");
message = userEntry.nextLine();
output.println(message);
response = input.nextLine();
System.out.println("\nSERVER> " + response);
} while (!message.equals("bye"));
}
}
}
Клиент отправляет сообщения, которые пользователь вводит, сервер отвечает «Сообщение получено» и отметка времени. Все работает хорошо, кроме одного сценария. Если я закрою клиент с помощью IntelliJ, закройте, а затем кнопку «Отключить»
, сервер readLine
непрерывно возвращает null
и печатает
Received: nullSending: Message Received: 2019-10-03T14:44:36.962
Received: nullSending: Message Received: 2019-10-03T14:44:36.962
Received: nullSending: Message Received: 2019-10-03T14:44:36.962
...
Объяснение поведения IntelliJ отключение объясняется здесь
Отключение (если доступно) ---> Если выбрана эта опция,рабочий процесс отключен.
Таким образом, это будет означать, что отключение поддерживает процесс, но IntelliJ больше не будет к нему подключен. Тем не менее, это не объясняет, почему readLine
постоянно возвращает null
.
Кто-нибудь может объяснить это поведение?