java - 消息为 "Connection timed out"的 ConnectionTimeoutException 和 SSLException 之间的区别

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

在我的 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/

相关文章:

java - android 进度对话框 ->publishProgress 方法

java - 自定义 Java 编译器(扩展)

java - 从字符串中查找特定排列

java - 非常简单的viewPager2

android - Firebase 设置问题

php - htaccess 使用 ssl 认证从 www 重定向到非 www url

java - 调整并发 HashMap 的大小

c# - 使用 C# HttpWebRequest 或 WebClient 发送 HTTP 请求?

http - 使用 POST+application/x-www-form-urlencoded 发送敏感数据

android - 在 Android 中将字符串从一个类传递到另一个类