如何在Java上检查SSLSocket连接是否正常?

如何在Java上检查SSLSocket连接是否正常?,java,sockets,ssl,Java,Sockets,Ssl,我有一个SSLSocket池,在借用对象之前,我需要检查套接字连接是否正常 isConnected、isInputShutdown和IsOutShutdown是无用的,因为它们不检查两侧是否都已连接,如果我尝试从套接字写入或读取,则可能会出现SocketException 以下是我测试连接的代码: if(sslSocket.isConnected() && !sslSocket.isInputShutdown() && !sslSo

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

isConnected、isInputShutdown和IsOutShutdown是无用的,因为它们不检查两侧是否都已连接,如果我尝试从套接字写入或读取,则可能会出现SocketException

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

if(sslSocket.isConnected() && 
       !sslSocket.isInputShutdown() && 
       !sslSocket.isOutputShutdown()){
    valid = true;
}
如上所述,此代码不起作用


那么,检查SSLSocket(或常规套接字)是否正常的最佳方法是什么?

尝试从套接字读取并捕获SocketException是否不够正常

如果“sane”是指已连接,则只有在尝试写入TCP套接字后,才能检测到该套接字已断开连接:


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

如果读取,请通过Socket.setSoTimeout()设置读取超时并捕获SocketTimeoutException,或者写入并捕获IOException:connection reset。没有其他机制。您提到的isXXX()API只告诉您对这个套接字做了什么。它们不会告诉您任何有关连接状态的信息。

我遇到了相同的问题,解决方法如下:由于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();
}

我无法从套接字读取数据,如果套接字上没有任何内容,这将导致阻塞。使用inputStream中的available()方法检查套接字上是否有可用的内容也是不够的。available()对于SSLSocket总是返回零,但存在超时机制,请看我的答案。我已经测试了通过连接发送一个字节并捕获异常,但这似乎没有测试读取操作,我可以在稍后读取时获得异常。我可能在这一点上错了,我会做更多的测试。同样的,在你阅读之前,你不能测试你是否能阅读。在测试套接字是否打开和从中读取数据之间,远程方可能已关闭连接。它甚至可能在您阅读时关闭它。请记住,套接字的状态部分由对等方控制。因此,您在本地计算机上执行的任何检查都很容易立即失效。