在我的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:这些例外情况似乎是在读取/写入数据时出现的 - 这应该会导致数据丢失 - 但我也无法观察到这一点。答案 0 :(得分:2)
不同之处在于,当根本无法建立连接时,会发生ConnectionTimeoutException
。这意味着根本无法访问服务器。
在已建立连接但在SSL握手期间连接超时时发生SSLException
。因为超时发生在SSL握手开始之后,SSLException
被抛出为更高级别的异常。
您可以尝试检查是否输入ConnectionTimeoutException
作为SSLException
的原因。