Помогите понять клиент-сервер

137
09 января 2021, 09:20

Изучаю серверы, пока на простом уровне. Задача такая: сервер загадывает число, клиент должен его угадать. Есть такой код на сервере:

   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();, но он не передает сообщение.

Answer 1

Добавьте ожидание того, чтобы клиент проверял наличие текста от сервера. Например, так

    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();
      }
}
Answer 2

Дело в том что ваш клиент ожидает строку 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"); и должно заработать.

READ ALSO
Не воспроизводится звук

Не воспроизводится звук

я использую следующий код:

153
Удалить одно поле из HashMap при помощи Stream API

Удалить одно поле из HashMap при помощи Stream API

У меня есть JSON с такой структурой:

115
toString (коллекции)

toString (коллекции)

Этот код выведет в консоль:

90
Spring Boot задержка выполнения метода

Spring Boot задержка выполнения метода

У меня есть клиент-серверное приложениеСерверная часть написана на Spring boot

97