2011-09-21 89 views
2

我正在寫一個基本的服務器客戶端程序在Java中,我試圖處理客戶端意外終止的情況。套接字關閉不拋出IOException

public void run() { 
    while(alive) { 
     try { 
      // socketIn is a BufferedReader wrapped around the socket's InputStream. 
      String input = socketIn.readLine(); 
      if(input == null) 
       continue; 
      String response = processInput(input); 
      // socketOut is a PrintWriter wrapped around the socket's OutputStream. 
      if(response != null) { 
       socketOut.println(response); 
       socketOut.flush(); 
      } 
     } catch(IOException e) { 
      System.out.println("TRACE 1"); 
      alive = false; 
     } 
    } 
    System.out.println("TRACE 2"); 
} 

但是,當我殺死客戶端,循環繼續進行,沒有TRACE打印出來。我假設當一個套接字從另一端關閉,我試圖從它讀取,它會拋出一個IOException。

這是一個糟糕的假設嗎?我能做些什麼來解決這個問題?

+1

考慮使用連接超時,並且注意SocketExceptions。 – Zaki

+0

連接超時是一個好主意,我認爲SocketException是IOException的一個子類。 – DanielGibbs

回答

4

readLine()將在數據流結束時返回null,這是遠程端正常關閉連接時發生的情況。你正試圖在這種情況下continue,這將永遠循環。如果連接異常中斷,將會拋出IOException

+0

我們通常從遠程套接字讀取如下:String msg = null; while((msg = s.readLine())!= null){//做msg讀取的內容...} //從遠程端關閉套接字。 –