2015-09-17 75 views
1
ServerSocket serverSocket = new ServerSocket(portNumber) 
Socket socket = serverSocket.accept(); 
try (
    BufferedReader in = new BufferedReader(
        new InputStreamReader(
         socket.getInputStream())); 
) { 
    while (in.readLine() != null) { 
    //do something 
    } 
    System.out.println("reach me if you can"); 
    socket.close(); 
} 

編寫我的服務器/客戶端軟件時,我試圖實現顯示當前連接數量的功能。但是我意識到,當客戶端突然終止時,我的服務器從不收到消息;它只是在in.readLine()等待。我應該如何確保創建用於處理特定連接的Thread不會在連接中斷時繼續運行?如何獲得客戶端斷開連接的通知?

+0

[看這裏](https://community.oracle.com/thread/1823461?start=0&tstart=0) – user2413972

+0

@ user2413972那麼,你的觀點是什麼?他也沒有得到他所需要的幫助。而且我比那個人更滯留,因爲我的'in.readLine();'不響應客戶端終止。 – user2651804

+0

我一直在寫網絡代碼。有收據-1字節或異常。 – user2413972

回答

1

這是一個普通的TCP問題,連接一端的機器可以在沒有任何通知到另一端機器的情況下消失。機器不是假設要做到這一點,但它並不總是在他們的控制之下。爲避免在這種情況下永久等待數據,和/或爲了避免加載死亡連接,一端常用的方法是使用超時。

一般問題比你描述的要大,但是你應該能夠通過在socket上調用setSoTimeout()一段時間,然後嘗試讀取它來解決你詢問的特定部分。如果您的讀取嘗試阻塞的時間超過指定的時間,套接字將引發異常。此設置在套接字的生命週期中保持不變(或者直到您設置了不同的值),所以如果您願意,可以在接受連接後立即應用它。

但是,請注意,一段足夠長的簡單客戶端不活動時間也會導致超時。

+0

非常感謝您的回答。一旦「控制流量」或什麼是正確的術語?是回到線程,有沒有一種簡單的方法來檢查客戶端是否仍然連接? – user2651804

+0

ServerSocket有一個isClosed()方法。 – Duston

+2

@Duston,'ServerSocket.isClosed()'對此沒有任何幫助,因爲在讀操作中沒有(直接)涉及'ServerSocket'。 'Socket.isClosed()'更相關,但它也沒有幫助 - 關鍵在於就本地計算機而言,套接字*不是關閉的。如果它正確關閉,無論是在讀取之前或讀取被阻塞時,讀取都會拋出異常。 –

相關問題