在我的 Android 代码中(使用 Apache HTTP 客户端)我已经设置了以下参数:
HttpConnectionParams.setConnectionTimeout(params, 30 * SECOND_IN_MILLIS);
HttpConnectionParams.setSoTimeout(params, 30 * SECOND_IN_MILLIS);
我正在连接到 HTTPS 网络服务。在慢速网络上,我在预期的 30 秒后收到了 ConnectionTimeoutException
(然后我重试);但是有“少数”情况(我无法观察到任何模式),我得到以下任何一个:
javax.net.ssl.SSLException: Read error: ssl=0xe71160: I/O error during system call, Connection timed out javax.net.ssl.SSLException: Write error: ssl=0xe71160: I/O error during system call, Broken pipe
我从 SO 那里得到这段代码,它仍在测试中:
registry.register(new Scheme("https",
SSLCertificateSocketFactory.getHttpSocketFactory(30 * SECOND_IN_MILLIS, null), 443));
我能理解连接建立超时和套接字超时——我的问题是我们真的需要 SSL 的第三个超时吗?目的与 SO_TIMEOUT 有何不同?
PS:这些异常似乎是在读/写数据时出现的——这应该会导致数据丢失——但我也无法观察到。
最佳答案
不同之处在于 ConnectionTimeoutException
在根本无法建立连接时发生。这意味着服务器根本无法访问。
SSLException
当连接已经建立但在 SSL 握手期间连接超时时发生。因为超时发生在 SSL 握手开始之后,SSLException
被作为更高级别的异常抛出。
您可以尝试检查是否输入了 ConnectionTimeoutException
作为 SSLException
的原因。
关于java - 消息为 "Connection timed out"的 ConnectionTimeoutException 和 SSLException 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13176648/