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

时间:2012-11-01 12:01:58

标签: java android http https apache-httpclient-4.x

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

HttpConnectionParams.setConnectionTimeout(params, 30 * SECOND_IN_MILLIS);
HttpConnectionParams.setSoTimeout(params, 30 * SECOND_IN_MILLIS);

我正在连接到HTTPS网络服务。在慢速网络上,我在预期的30秒后获得ConnectionTimeoutException(然后我重试);但是有“少数”案例(没有我能观察到的模式),我得到以下任何一种:

  

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

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

registry.register(new Scheme("https", 
    SSLCertificateSocketFactory.getHttpSocketFactory(30 * SECOND_IN_MILLIS, null), 443));

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

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

1 个答案:

答案 0 :(得分:2)

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

在已建立连接但在SSL握手期间连接超时时发生SSLException。因为超时发生在SSL握手开始之后,SSLException被抛出为更高级别的异常。

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