2015-10-07 94 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的大力支持。 .. –