8

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

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

我正在连接到 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));

我可以理解连接建立超时和套接字超时 - 我的问题是我们真的需要 SSL 的第三次超时吗?目的与 SO_TIMEOUT 有何不同?

PS:这些异常似乎在读取/写入数据时出现 - 这应该导致数据丢失 - 但我也无法观察到。

4

1 回答 1

3

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

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

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

于 2012-11-10T22:41:09.113 回答