2009-07-20 125 views
3

如果我殺了套接字服務器過程中,我的客戶端的Socket過程中沒有收到任何錯誤,它會繼續循環下去以下代碼:java的socket服務器,客戶端檢測到服務器已經死亡

public void run() { 
    while(readData) { 
     String inputLine = null; 
     try { 
     while((inputLine = m_inputStream.readLine()) != null) { 
      //do stuff 
     } 
     } catch (IOException e) { 
     readData = false; 
    } 
    } 
} 

我怎樣才能檢測到套接字服務器消失並終止循環?

回答

4

當呼叫readLine()返回null時,終止外部循環。

服務器正常關閉連接時不會引發異常。該流應返回null以表示數據結束。

這可以通過這樣的循環來實現:

public void run() { 
    try { 
    while (true) { 
     String line = input.readLine(); 
     if (line == null) 
     break; 
     /* Process line. */ 
     ... 
    } 
    } catch (IOException ex) { 
    /* Handle the exception as desired. */ 
    ex.printStackTrace(); 
    } 
} 
+0

因此,如果連接關閉,流將僅返回null? – anio 2009-07-20 22:40:31

0

雖然從埃裏克森是正確的答案,你有沒有嘗試設置socket read time-out properties? (例如sun.net.client.defaultReadTimeout)。如果服務器可能需要很長時間才能響應,那麼這可能不太有用,因爲它可以解決您的問題,但在許多情況下仍是一個好主意。

相關問題