[英]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.