2015-10-07 53 views
0

我已经在这里读了一些线程在计算器,还有一些教程,但我没有找到一个解决我的问题。阅读多行使用的BufferedReader(插座)

我有连接到服务器Java客户端,然后发送刚好一个线到服务器,并且我得到2个或3行作为响应。

这里是我的代码:

public static void main(String[] args) { 
    String message; 
    String response; 

    try { 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     Socket clientSocket = new Socket(hostname, port); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     message = inFromUser.readLine(); 
     outToServer.writeBytes(message + '\n'); 

     // here my program "freezes" 
     while ((response = inFromServer.readLine()) != null) { 
      System.out.println("response: " + response); 
     } 
     clientSocket.close(); 
    } catch (UnknownHostException e) { 
     System.out.println("Unknown Host"); 
    } catch (IOException e) { 
     System.out.println("IO Exception"); 
    } 
} 

我的问题是,我可以读取响应的每一行,但我的程序不会退出。该行clientSocket.close();从未被调用过。我究竟做错了什么?

回答

4

大概你的服务器没有关闭连接 - 因此读取器的底层流没有关闭...在任何时候服务器可能发送更多信息。 readLine()只返回null当流已关闭,即有肯定不会是任何更多的数据。

现在我们不知道的任何协议这里,但如果预期的行为是客户端将不会发送任何更多的信息,服务器将关闭连接,那么错误是在服务器中。如果协议声明服务器将保持连接处于打开状态,那么错误出现在您的客户端代码中,并且您需要弄清楚如何检测数据的结束(或者发送某种会导致服务器关闭连接的确认, 管他呢)。

+0

好的,谢谢对你的回答。我们的连接没有真正的协议,服务器会发送一条消息,如“您的帐户已成功注册”。然后它结束了。我认为有一个优雅的解决方案可用,我不想检查response.contains(“成功注册”)例如。 – beeef

+0

@beeef:那里*是一个协议,即使它是隐含的。这听起来像服务器应当关闭连接...但它会坦率地说可能是简单的,如果你只是做服务器和客户端使用HTTP来代替,因为有一个在提供几乎所有被广泛使用的平台,为HTTP的大力支持。 .. –