2010-08-25 63 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(); 
}