ConnectionTimeoutException与SSLException之间的区别,消息"Connection timed out"

Win*_*Win 6 java https android http apache-httpclient-4.x

在我的Android代码上(使用Apache HTTP Client)我已经设置了以下参数:

HttpConnectionParams.setConnectionTimeout(params, 30 * SECOND_IN_MILLIS);
HttpConnectionParams.setSoTimeout(params, 30 * SECOND_IN_MILLIS);
Run Code Online (Sandbox Code Playgroud)

我正在连接到HTTPS网络服务.在慢速网络上,我得到一个ConnectionTimeoutException预期的30秒(然后我重试); 但是有"很少"的情况(没有我能观察到的模式),我得到以下任何一种:

javax.net.ssl.SSLException:读取错误:ssl = 0xe71160:系统调用期间的I/O错误,连接超时javax.net.ssl.SSLException:写入错误:ssl = 0xe71160:系统调用期间的I/O错误,Broken管

我从SO获得了这个代码,它仍在测试中:

registry.register(new Scheme("https", 
    SSLCertificateSocketFactory.getHttpSocketFactory(30 * SECOND_IN_MILLIS, null), 443));
Run Code Online (Sandbox Code Playgroud)

我可以理解连接建立超时和套接字超时 - 我的查询是否真的需要SSL的第3次超时?目的与SO_TIMEOUT有何不同?

PS:这些例外情况似乎是在读取/写入数据时出现的 - 这应该导致数据丢失 - 但我也观察不到.

Uwe*_*nus 3

不同之处在于,ConnectionTimeoutException当根本无法建立连接时会发生这种情况。这意味着根本无法访问服务器。

SSLException当连接已建立但在 SSL 握手期间连接超时时,就会发生这种情况。因为超时发生在 SSL 握手开始之后,所以SSLException会作为更高级别的异常抛出。

您可以尝试检查是否ConnectionTimeoutException输入了 a 作为 的原因SSLException