区分连​​接被拒绝和连接超时

Sti*_*ael 7 java sockets connection

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

java.net.ConnectException: Connection timed out: connect

java.net.ConnectException: Connection refused: connect
Run Code Online (Sandbox Code Playgroud)

我怎样才能安全地区分这两者?确保解析错误消息完成了这项工作.但是当消息在未来的Java版本中发生变化时,我运气不好.

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

Mat*_*hen 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 匹配的情况下有后备措施。