【问题标题】:ConnectException vs. IOException when wiFi is disabled?禁用 WiFi 时的 ConnectException 与 IOException?
【发布时间】:2012-04-15 04:50:06
【问题描述】:

我尝试连接到一个 IP 地址(例如http://222.222.222.222:8080)和一个 URL(例如http://www.website.com),而我的 wifi 被禁用。我注意到,如果我没有 wifi 并且我尝试连接到 IP 地址,它会给我一个 ConnectException 错误。另一方面,如果我没有 wifi 并且我尝试连接到 URL,它会给我一个 IOException 错误。为什么我在这两种情况下收到不同的Exception,而唯一的区别是我为第一种情况提供了 IP 地址,为另一种情况提供了 URL?有人可以启发我吗?我要求澄清这一点。

谢谢!

【问题讨论】:

  • 您是使用 HttpUrlConnection、HttpClient 还是其他类来连接 URL?

标签: android exception ioexception connectexception


【解决方案1】:

由于不同的步骤失败,您会收到不同的错误。

当您尝试连接到 IP 地址的端口 80 时,这是一个失败的 connect(2) 系统调用。 connect(2) 失败的原因有很多;您需要检查来自异常的消息,以便向用户提供良好的错误消息。

当您尝试连接到文本地址的端口 80 时,库将首先尝试使用getaddrinfo(3) 将主机名解析为 IP 地址。名称解析可能会失败,也可能不会失败——例如,如果您尝试连接到localhost,则通常不需要网络访问,因为名称服务查找可以完全在本地设备上处理。因为名称服务失败是因为您无法联系名称服务器,所以给出不同的错误消息(和异常)是有意义的,即使基础原因对于给定的一组测试是相同的。由于各种原因,您可能无法联系名称服务器。同样,您需要检查来自异常的消息,以便向用户提供良好的错误消息。

【讨论】:

  • 感谢您的回答!如果我正确理解您的解释,Android 有不同的步骤来连接 IP 地址和文本地址?由于 2 有不同的步骤,错误信息的处理方式不同吗?尝试连接到文本地址意味着您仍然必须连接到名称服务器来解析 IP 地址。如果无法从名称服务器检索 IP 地址,则会返回不同的错误消息。仅当您已尝试访问 IP 地址但未能建立连接时才返回 ConnectException?
  • 它不是特定于 Android 的;它在支持 TCP/IP 系列协议的所有设备和平台上都是通用的。错误消息的详细信息因平台而异,但总的来说,您可以很容易地得到 protocol 级别的错误——将其转换为人性化的建议,例如“你的调制解调器是拔掉插头”或“网线接反”或“WiFi 路由器故障”非常困难。
  • 我现在明白了。感谢您的澄清! :D
猜你喜欢
  • 1970-01-01
  • 2016-03-26
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多