BufferedReader readLine пропускает каждую вторую строку - PullRequest
2 голосов
/ 26 августа 2011

Я использую сокеты для связи между сервером и клиентом. Однако по какой-то причине клиент пропускает каждую вторую строку, отправленную сервером.

Код клиента:

    ...

    out.println(console.readLine());                //Client initiates (sent to server)

    while ((userOut = in.readLine()) != null)       //Waits for response
    {
        System.out.println("Server says: " + userOut);  //Prints response

        userIn = console.readLine();                //Gets user input
        out.println(userIn);                        //Sends user input to server
    }

    ...

Серверы Код:

    ...

    while ((clientIn = in.readLine()) != null)  //Waits for clients message
    {
        System.out.println("Client says: " + clientIn); //Print clients message

        //Send appropriate response
        if (clientIn.equals(CLIENT_INSTRUCTION_LOGCALC))
        {
            out.println(SERVER_RESPONSE_LOGCALC_OK); //Send response to client
            System.out.println("Message sent: " + SERVER_RESPONSE_LOGCALC_OK); //Print response sent
        }

        else if (clientIn.equals(CLIENT_INSTRUCTION_SB))
        {
            out.println(SERVER_RESPONSE_SB_CHANGE);
        }

        else if (clientIn.equals(CLIENT_INSTRUCTION_BYE))
        {
            out.println(SERVER_RESPONSE_BYE_OK);
        }

        else if (clientIn.equals(CLIENT_INSTRUCTION_END))
        {
            out.println(SERVER_RESPONSE_END_OK);
        }

        else
        {
            out.println(SERVER_RESPONSE_INPUT_ERR);
        }
        ...

Пример использования этих дисплеев (клиент сначала):

 LOGCALC
 Server says: LOGCALC: OK
 LOGCALC
 Server says: 

Сервер:

Client says: LOGCALC
Message sent: LOGCALC: OK

Client says: LOGCALC
Message sent: LOGCALC: OK

Надеюсь, вы видите, что во втором сообщении LOGCALC, отправленном на сервер, сервер ответил, но клиент не получил ответ сервера.

Есть мысли?

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Клиент определенно получает «некое» сообщение, отсюда и напечатанная часть «Сервер говорит».Кажется, что сервер как-то написал дополнительную новую строку при отправке «первого ответа» клиенту, что приводит к чтению пустой строки на второй итерации.Во втором случае стоило бы проверить / отладить значение userOut.

Кроме того, я не уверен, намеренно ли это, но я вижу пустую строку в случае вывода с сервера.Предполагая, что весь вывод выводит фрагмент кода с кодом, откуда взялся этот дополнительный символ новой строки?

0 голосов
/ 26 августа 2011

Глядя на ваш вывод, вы видите, что у вас есть дополнительный разрыв строки в SERVER_RESPONSE_LOGCALC_OK, так как System.out.println("Message sent: " + SERVER_RESPONSE_LOGCALC_OK); имеет дополнительную строку после него в выходных данных сервера. Я бы удалил лишнюю новую строку или использовал бы простой out.print(SERVER_RESPONSE_LOGCALC_OK) вместо out.println(SERVER_RESPONSE_LOGCALC_OK);. Это должно решить вашу проблему с пропуском.

Основной недостаток, который вы испытываете, заключается в том, что вы читаете только одну строку за раз и затем ждете ввода пользователя, прежде чем читать другую строку вместо того количества строк, которое доступно, прежде чем ждать ввода пользователя. Держу пари, что если вы сделаете что-то вроде кода ниже в клиенте, вы увидите другой вывод.

out.println(console.readLine());                //Client initiates (sent to server)

    while ((userOut = in.readLine()) != null)       //Waits for response
    {
        System.out.println("Server says: " + userOut);  //Prints response

        if(!in.available()){
          userIn = console.readLine();                //Gets user input
          out.println(userIn);                        //Sends user input to server
        }
    }
0 голосов
/ 26 августа 2011

Readline ()

сканирует для \ r \ n, только \ r или только \ n.

Я думаю, сервер может ответить \ n \ r-переводом строки, в этом случае вы станете двойным переводом строки (один для \ n, другой для \ r).

Насколько я вижу, это не может быть проблемой для функциональности вашего кода. Итак, чтобы пропустить проблему логирования: вы можете проверить наличие пустого userOut (проверить по пустоте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...