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

7
使用java.net.Socket.connect()时,无论是拒绝连接还是超时都会导致ConnectException
java.net.ConnectException: Connection timed out: connect

java.net.ConnectException: Connection refused: connect

我如何安全地区分两者?解析错误消息可以完成任务。但是,当消息在未来的Java版本中更改时,我就没辙了。

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

3个回答

3

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


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匹配。

我喜欢这个答案,但仍然坚持我的先前建议:将其抽象化!你最不想要的是在一个你无法依赖的接口上进行一堆不一致和重复的检查。创建一个对你有意义的接口,并将细节抽象化。如果有任何变化,你不想编辑十几个文件。 - riwalk

0

查看错误信息(就像你所提到的),但将其抽象化。

如果在将来的Java版本中更改了它,则只需更改抽象层,而无需更改代码核心。


1
如果JVM有本地化消息,这将立即中断。 - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接