Изучаю серверы, пока на простом уровне. Задача такая: сервер загадывает число, клиент должен его угадать. Есть такой код на сервере:
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
while(true) {
Socket clientSocket = serverSocket.accept();
OutputStreamWriter writer = new OutputStreamWriter(clientSocket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
writer.write("Try to guess a number from 0 to 10: ");
writer.flush();
// String request = reader.readLine();
// int num = Integer.parseInt(request);
// System.out.println(num);
writer.close();
clientSocket.close();
}
}
И такой на клиенте:
Scanner scanner = new Scanner(System.in);
Socket clientSocket = new Socket("127.0.0.1", 8000);
OutputStreamWriter writer = new OutputStreamWriter(clientSocket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String response = reader.readLine();
System.out.println(response);
String request = scanner.nextLine();
writer.write(request);
writer.flush();
Я иду последовательно. Сначала создаются сокеты и ридеры/райтеры. Сервер отправляет клиенту сообщение - попробуй угадать число. Клиент выводит его в консоль, но (! вот тут проблема !) ровно до того момента, пока я не активирую те строки, что в коде выше закомментированы. Этого я не понимаю. Ведь сервер сначала должен передать сообщение, а потом ждать ответа в строке String request = reader.readLine();, но он не передает сообщение.
Добавьте ожидание того, чтобы клиент проверял наличие текста от сервера. Например, так
Scanner scanner = new Scanner(System.in);
Socket clientSocket = new Socket("127.0.0.1", 8000);
OutputStreamWriter writer = new OutputStreamWriter(clientSocket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String response = reader.readLine();
while(response!=null) {
System.out.println(response);
String request = scanner.nextLine();
writer.write(request);
writer.flush();
}
}
Дело в том что ваш клиент ожидает строку reader.readLine()
, а сервер окончания строки не передает writer.write("Try to guess a number from 0 to 10: ");
Поправьте на writer.write("Try to guess a number from 0 to 10: \n");
и должно заработать.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть клиент-серверное приложениеСерверная часть написана на Spring boot