2012-08-26 50 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"); 

和它的正常工作