2012-08-26 53 views
0

我犯了一個客戶端服務器的聊天程序,但由於某種原因,當我送東西到服務器,反之亦然我收到一個額外的空行socket.readLine()讀取兩次

例如,如果客戶說「你好」 服務器臨危.... { 客戶:您好 客戶端: } 這些發送和收到功能

public static void send(){ 
    out.println(message_out); 

    } 



public void read(){  


    try { 
     while(true) 
     { 

     message_in = in.readLine(); 

      ConversationBox.append("Client :"+message_in+"\n"); 

     } 
    } catch (IOException e) { 

    System.out.println("Client disconnected!"); 
    e.printStackTrace(); 

    } 



} 



} 

回答

0

第二讀取似乎是導致的同時升異常和結束的空值接力。相反,您應該使用以下while循環:

while ((message_in = in.readLine()) != null) 
    ConversationBox.append("Client :"+message_in+"\n"); 
+0

你的第一句是不正確。 null值不會導致異常,或者結束該代碼中的while循環。 – EJP

+0

仍然是相同的行爲 – Exorcismus

0

您的協議沒有提供唯一標識消息結尾的方法。如果消息是「foo \ nbar」,則將其作爲「foo \ nbar \ n」發送。由於接收者將一個換行符解釋爲一個消息分隔符,接收者將看到兩條消息「foo」,然後是「bar」。

如果你打算使用新行作爲消息分隔符,你必須做兩件事情之一:

  1. 確保沒有消息永遠包含一個換行符。

  2. 如果消息包含換行符,請以某種方式將其轉義並在接收方中檢測到。

否則,信息「Hello \ n」將以「Hello \ n \ n」的形式發送,並以「Hello」的形式發送,之後是空信息。

0

以及THX大衛·施瓦茨,我用

if(message_in.isEmpty()){} 
else 
ConversationBox.append("Server :"+message_in+"\n"); 

和它的正常工作