【问题标题】:Distinguish between connection refused and connection timed out区分连​​接被拒绝和连接超时
【发布时间】:2010-07-29 14:24:47
【问题描述】:

使用java.net.Socket.connect() 时,连接被拒绝和超时都会导致ConnectException

java.net.ConnectException: Connection timed out: connect

java.net.ConnectException: Connection refused: connect

如何安全地区分两者?当然解析错误消息可以完成这项工作。但是当消息在未来的 Java 版本中发生变化时,我就不走运了。

更大的图景:我正在编写一个使用 JAX-WS 和 Metro 实现的 Web 服务客户端。当 Web 服务调用失败时,我想清楚地报告失败的原因,以便快速解决问题。

【问题讨论】:

    标签: java sockets connection


    【解决方案1】:

    测量调用 connect() 和引发异常之间的时间,并传递该信息。

    【讨论】:

      【解决方案2】:

      不幸的是,在 Sun JDK 中,此信息仅在字符串中提供。请参见 PlainSocketImpl.c(对于 *ix)和 net_util_md.c(对于 Windows)的第 473 行。 *ix 实现有时会调用 NET_ThrowByNameWithLastError(来自 *ix net_util_md.c),它会在字符串中包含 errno;这个函数在windows上是有的,但是这里没有用到..

      因此,您必须依赖字符串并希望它们不会改变。 Sun 似乎没有对它们进行本地化,这是有道理的,因为它们不应该面向用户。您可以尝试将errno解析出来以获得更稳定的错误代码。

      您还应该确保在没有字符串或 errno 匹配的情况下进行后备。

      【讨论】:

      • 我喜欢这个答案,但保持我以前的建议:抽象它!您最不想要的是对您无法依赖的界面进行大量不一致和重复的检查。创建一个对您有意义的界面,并抽象出细节。如果有任何变化,您不想编辑十几个文件。
      【解决方案3】:

      检查错误消息(就像您提到的那样),但将其抽象出来。

      如果它在未来的 Java 版本中发生更改,您可以在抽象中对其进行更改,并保留代码的核心。

      【讨论】:

      • 如果 JVM 有本地化消息,这将立即中断。
      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2021-06-27
      • 2021-03-29
      相关资源
      最近更新 更多