簡體   English   中英

BufferedReader readLine每隔第二行跳過一次

[英]BufferedReader readLine skipping every second line

我正在使用套接字在服務器和客戶端之間進行通信。 但是由於某種原因,客戶端跳過服務器發送的第二行。

客戶代碼:

    ...

    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消息中,服務器已響應,但是客戶端未收到服務器響應。

有什么想法嗎?

客戶肯定會收到“某種”消息,因此打印了“服務器說”部分。 在向客戶端發送“第一響應”時,服務器似乎以某種方式寫了額外的新行,從而導致在第二次迭代中讀取空字符串。 在第二種情況下,值得檢查/調試userOut的值。

另外,我不確定這是否是故意的,但是如果服務器輸出,我會看到一個空行。 假設是所有輸出的發布代碼段,多余的換行符從何而來?

的readLine()

僅通過\\ r或僅通過\\ n掃描\\ r \\ n。

我認為,服務器可以通過\\ n \\ r-linebreak來回答,在這種情況下,您將成為雙換行符(一個代表\\ n,另一個代表\\ r)。

據我所知,這可能不是代碼功能的問題。 因此,要跳過日志記錄問題:您可以檢查是否有空的userOut(按空性檢查)。

查看輸出,看來您在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
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM