Большинство реализаций SSLSocket поддерживают setHandshakeTimeout () , но оно не является частью определения класса. Я предлагаю вам взглянуть, например, на код Android. Вот хороший пример того, как с этим справиться: фабричная оболочка ssl-сокета и фабрика ssl-сокетов
Проверьте, как они пытаются установить тайм-аут рукопожатия, если он существует:
private void setHandshakeTimeout(SSLSocket sslSocket, int timeout) {
try {
// Most implementations of SSLSocket support setHandshakeTimeout(), but it is not
// actually part of the class definition. We will attempt to set it using reflection.
// If the particular implementation of SSLSocket we are using does not support this
// function, then we will just have to use the default handshake timeout.
sslSocket.getClass().getMethod("setHandshakeTimeout", int.class).invoke(sslSocket,
timeout);
} catch (Exception e) {
LogUtils.w(LogUtils.TAG, e, "unable to set handshake timeout");
}
}
И посмотрите, как они получают соединение:
SSLSocket sslsock = (SSLSocket)
((sock != null) ? sock : createSocket());
if ((localAddress != null) || (localPort > 0)) {
// we need to bind explicitly
if (localPort < 0)
localPort = 0; // indicates "any"
InetSocketAddress isa =
new InetSocketAddress(localAddress, localPort);
sslsock.bind(isa);
}
int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
int soTimeout = HttpConnectionParams.getSoTimeout(params);
InetSocketAddress remoteAddress;
if (nameResolver != null) {
remoteAddress = new InetSocketAddress(nameResolver.resolve(host), port);
} else {
remoteAddress = new InetSocketAddress(host, port);
}
sslsock.connect(remoteAddress, connTimeout);
sslsock.setSoTimeout(soTimeout);
try {
hostnameVerifier.verify(host, sslsock);
// verifyHostName() didn't blowup - good!
} catch (IOException iox) {
// close the socket before re-throwing the exception
try { sslsock.close(); } catch (Exception x) { /*ignore*/ }
throw iox;
}
return sslsock;
Надеюсь, это поможет.