2014-04-19 57 views
0

我使用Java Knock Knock教程來創建客戶端 - 服務器連接,但我無法弄清楚如何檢查套接字是否仍然打開。檢查套接字是否仍然打開

簡化代碼:

try { 
    while ((clientMessage = inFromClient.readLine()) != null) { 
     //do stuff 
    } catch (IOException e) { 
     //client disconnected 
     e.printStackTrace(); 
    } 
} 

這個偉大的工程,但我注意到,當客戶端是基於異常,如果客戶被強行關閉未拋出的Linux。我嘗試了一些其他人發佈的建議,但無法正常工作。我試圖實現一個循環來檢查自從最後一條消息被接收後它已經過了多長時間,但它不起作用,循環必須位於上述代碼中的循環內部,並且只有在收到來自客戶端。我很困惑,但我不明白如何實現任何檢查方法。

如果我把方法在上面的循環之外檢查不活動,那麼它永遠不會被調用,因爲套接字循環是無限的(除非套接字被關閉)。

+0

可能重複[Java Socket API:如何判斷連接是否已關閉?](http://stackoverflow.com/questions/10240694/java-socket-api-how-to-tell-if- a-connection-has-closed-關閉) –

+0

其實我讀過,即使socket被關閉,它仍然會返回true。但更大的問題是我可以在循環中調用它。我的代碼中的循環只有在收到消息時才被調用,如果我將它添加到代碼中,那麼它只會被調用一次(在收到消息之後),那就是它。 編輯:它不是重複的,請閱讀這個問題。問題不在於檢測IF ITS CLOSED的方法,問題是讓方法不止一次檢查。 – Cody

+0

http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setSoTimeout%28int%29 – JimmyB

回答

2

只需使用Socket.setSoTimeout()設置讀取超時即可。將其設置爲高於預期的請求間隔,例如說是雙倍。如果過期,你將得到一個SocketTimeoutException:關閉套接字。

與某些評論相反,isConnected(),isBound(),isClosed()等對此沒有用處。他們告訴你是否連接,綁定,關閉等套接字。不是關於連接的狀態。

+0

哇,太簡單了,謝謝!這工作非常好! :P – Cody

相關問題