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

时间:2010-07-29 14:24:47

标签: java sockets connection

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

java.net.ConnectException: Connection timed out: connect

java.net.ConnectException: Connection refused: connect

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

不幸的是,在Sun JDK中,除了字符串之外,此信息不在任何地方。请参阅PlainSocketImpl.c的第473行(适用于* ix)和net_util_md.c(适用于Windows)。 * ix实现有时会调用NET_ThrowByNameWithLastError(来自* ix net_util_md.c),它将在字符串中包含errno; Windows上存在此功能,但此处未使用..

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

如果没有字符串或errno匹配,你也应该确保有一个后备。

答案 2 :(得分:0)

检查错误消息(如您​​所述),但将其抽象出来。

如果它在未来的Java版本中发生变化,您可以在抽象中进行更改,并将代码的核心单独留下。