Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 区分连接被拒绝和连接超时_Java_Sockets_Connection - Fatal编程技术网

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

Java 区分连接被拒绝和连接超时,java,sockets,connection,Java,Sockets,Connection,使用java.net.Socket.connect()时,拒绝连接和超时都会导致ConnectException java.net.ConnectException: Connection timed out: connect java.net.ConnectException: Connection refused: connect 我怎样才能安全地区分这两者?请确保解析错误消息可以完成此任务。但是,当消息在未来的Java版本中发生变化时,我就不走运了 更大的图景:我正在使用JAX-WS和

使用
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版本中发生更改,您可以在抽象中更改它,而不必考虑代码的核心。

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

不幸的是,在Sun JDK中,除了字符串之外,此信息在任何地方都不可用。参见的第473行(对于*ix),和(对于Windows)。*ix实现有时会调用NET_ThrowByNameWithLastError(来自*ix),这将在字符串中包含errno;此函数存在于Windows上,但此处不使用

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


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

如果JVM有本地化消息,这将立即中断。我喜欢这个答案,但保留我以前的建议:将其抽象掉!您最不希望看到的是在一个您无法依赖的接口上进行一系列不一致且重复的检查。创建一个对您有意义的界面,并抽象出细节。如果有任何变化,您不希望编辑十几个文件。