2010-08-25 21 views
2

我有一個SSLSocket池,我需要在借用對象前檢查套接字連接是否健全。如何檢查Java上的SSLSocket連接是否健全?

isConnected,isInputShutdown和isOutputShutdown是無用的,因爲它們不檢查雙方是否連接,如果我嘗試寫入或從套接字讀取,我可能會得到一個SocketException。

這裏是我的測試連接代碼:

if(sslSocket.isConnected() && 
     !sslSocket.isInputShutdown() && 
     !sslSocket.isOutputShutdown()){ 
    valid = true; 
} 

此代碼不能正常工作,如上所述。

那麼,檢查SSLSocket(或普通Socket)是否健全的最佳方法是什麼?

回答

3

如果「健全」你的意思是連接的,則只能檢測到TCP套接字斷開一旦你試圖寫它:

http://lkml.indiana.edu/hypermail/linux/kernel/0106.1/1154.html

因此,你需要使用在Java中相應的例外。

+0

我測試過在連接上發送一個字節並捕獲異常,但似乎這不會測試讀取操作,並且在稍後閱讀時可能會遇到異常。我可能在這方面是錯誤的,會做更多的測試。 – Isac 2010-08-25 16:55:44

+0

同樣的事情,你不能測試你是否可以閱讀,直到你閱讀。在測試套接字是否打開以及從中讀取套接字的時間之間,遠程方可能已關閉連接。它在閱讀時甚至可能會關閉它。 – Bruno 2010-08-25 16:59:15

+0

請記住,套接字的狀態是由對等體部分控制的。因此,您在本地計算機上執行的任何檢查都很容易立即失效。 – Darron 2010-08-25 17:00:07

0

試圖從套接字讀取並捕獲一個SocketException不夠理智?

+0

如果在套接字上沒有任何東西,那麼我將無法從套接字讀取數據,那將會阻塞。使用inputStream中的available()方法檢查套接字上是否有可用的東西是不夠的。 – Isac 2010-08-25 16:48:33

+0

available()對於SSLSocket總是返回零,但有超時機制,請參閱我的答案。 – EJP 2010-08-26 08:27:17

0

如果讀取,通過Socket.setSoTimeout()設置readTimeout並捕獲SocketTimeoutException,或者編寫並捕獲IOException:connection reset。沒有其他機制。你提到的isXXX()API只告訴你已經做了這個Socket。他們不會告訴你有關連接狀態的任何信息。

0

我有同樣的問題,在這裏被修復:由於的SSLSocketsslServerSocket創建,關閉服務器套接字,而不是插座將工作的。

使用建議的超時時間,捕獲SSLException並關閉套接字應有助於確保連接仍然有效,而無需使用線程。

sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(sslServerSocketPort); 
sslsocket = (SSLSocket) sslserversocket.accept(); 
sslsocket.setSoTimeout(5000); 

// Restart connections 
if(sslserversocket.isClosed() || sslserversocket == null){ 
    sslserversocket.close(); 
    startSSLServer(); 
}