如何检查SSLSocket连接是否在Java上是否合理?

时间:2010-08-25 16:42:51

标签: java sockets ssl

我有一个SSLSocket池,我需要在借用对象之前检查套接字连接是否正常。

isConnected,isInputShutdown和isOutputShutdown是无用的,因为它们不会检查双方是否都已连接,如果我尝试从套接字写入或读取,我可能会收到SocketException。

以下是我测试连接的代码:

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

如上所述,此代码不起作用。

那么,检查SSLSocket(或常规Socket)是否理智的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

如果“理智”意味着连接,那么只有在尝试写入TCP套接字时才会检测到它已断开连接:

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

因此,您需要在Java中相应地使用异常。

答案 1 :(得分:0)

试图从套接字读取并捕获SocketException不够理智吗?

答案 2 :(得分:0)

如果正在读取,请通过Socket.setSoTimeout()设置readTimeout并捕获SocketTimeoutException,或者写入并捕获IOException:connection reset。没有其他机制。你提到的isXXX()API只告诉你这个Socket做了什么。他们没有告诉你关于连接状态的任何信息。 / em>的

答案 3 :(得分:0)

我遇到了同样的问题,这是修复:由于 sslSocket 是从 sslServerSocket 创建的,因此关闭服务器套接字而不是套接字将起作用。

使用建议的超时,捕获SSLException并关闭套接字应该有助于确保连接仍然有效而无需线程化。

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

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