Цикл while не прерывается после чтения нескольких строк текста с помощью BufferedReader в Java Socket

Я пытаюсь отправить несколько строк кода с клиента на сервер.

Вот код на стороне сервера

            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);

            //read client input
            //multi line 
            //https://stackoverflow.com/questions/43416889/java-filereader-only-seems-to-be-reading-the-first-line-of-text-document?newreg=2f77b35c458846dbb1290afce8853930
            String line = "";
            while((line =in.readLine()) != null) {
                System.out.println(line);
            }
            System.out.println("is it here?");

Вот код на стороне клиента:

    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter out = new PrintWriter(socket.getOutputStream(),true);

    while (true) {
        System.out.print("> ");

        //content server input command (put, lamport clock, message)
        String command = keyboard.readLine();
        if (command.equals("quit")){
            break;
        }
        //read from CSDB/txt1.txt
        String message = readFileReturnString("CSDB/txt1.txt", StandardCharsets.UTF_8);
        System.out.println(message);
        //send to clientHandler through PrintWriter
        out.println(command + " 3 \n" + message);

        //receive response from ClientHandler (lamport clock)
        String serverResponse = input.readLine();
        System.out.println(serverResponse + socket);
    }

Сторона сервера может распечатать весь текст, отправленный со стороны клиента. Однако цикл while не прерывается, и System.out.println("is it here?"); никогда не был казнен.

Могу ли я узнать, почему и как я могу решить эту проблему, пожалуйста?

Вам нужно закрыть сокет.

talex 01.10.2022 10:18

Но я хотел бы повторно использовать этот сокет. Поскольку я могу отправить сообщение с клиента на сервер более одного раза.

Cecil 01.10.2022 10:21

Затем вам нужно сообщить серверу, когда он должен выйти из цикла. Вы можете отправить специальную строку или что-то в этом роде.

talex 01.10.2022 10:22

Или используйте неблокирующий

g00se 01.10.2022 10:23

@ g00se это не поможет.

talex 01.10.2022 10:24

@talex не уверен, почему ты так говоришь

g00se 01.10.2022 10:30

@ g00se, потому что неблокирующий ввод-вывод не поможет серверу понять, когда эта конкретная часть связи завершена. Если вы думаете, что я ошибаюсь, не могли бы вы объяснить свое предложение более подробно.

talex 01.10.2022 10:33

@talex Ну, я прочитал, это здесь? как «это строка отладки», а не «я понятия не имею, что клиент собирается отправить». Итак, если моя догадка верна, когда «единица связи» поступает в неблокирующий ввод-вывод, эта единица может быть захвачена и обработана.

g00se 01.10.2022 11:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш Клиент ждет какого-то ответа Сервера. Но Сервер не отправляет никакого ответа. Сервер пишет только в System.out. Сервер должен написать ответ с помощью out.

        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out = new PrintWriter(client.getOutputStream(), true);

        //read client input
        //multi line 
        //https://stackoverflow.com/questions/43416889/java-filereader-only-seems-to-be-reading-the-first-line-of-text-document?newreg=2f77b35c458846dbb1290afce8853930
        String line = "";
        while((line =in.readLine()) != null) {
            System.out.println(line);
            out.println(line);  // send Server response
        }
        System.out.println("is it here?");
Ответ принят как подходящий

@ талекс Затем вам нужно сообщить серверу, когда он должен выйти из цикла. Вы можете отправить специальную строку или что-то в этом роде.

Это прекрасно работает.

        String line = "";
        while((line =in.readLine()) != null) {
            System.out.println(line);
            if (line.equals("break") {
            break;
            }
        }

Другие вопросы по теме