我有一个SSLSocket池,我需要在借用对象之前检查套接字连接是否正常。
isConnected,isInputShutdown和isOutputShutdown是无用的,因为它们不会检查双方是否都已连接,如果我尝试从套接字写入或读取,我可能会收到SocketException。
以下是我测试连接的代码:
if(sslSocket.isConnected() &&
!sslSocket.isInputShutdown() &&
!sslSocket.isOutputShutdown()){
valid = true;
}
如上所述,此代码不起作用。
那么,检查SSLSocket(或常规Socket)是否理智的最佳方法是什么?
答案 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();
}