0

我写了一个简单的 java tcp 客户端。每次运行客户端时,我都会在命令行中指定服务器 IP 地址。

当没有服务器监听指定的 IP 地址或 IP 地址不存在时,会引发 SocketTimeoutException。这对于运行客户端的子网之外的任何 IP 地址都可以正常工作。如果我在客户端的同一子网上指定了错误的服务器 IP 地址,则会引发 java.net.NoRouteToHostException。

这对我来说很奇怪。两个地址都属于同一个子网,绝对不需要 ip 路由就可以到达服务器。如果服务器位于与客户端不同的子网中,并且运行客户端的主机没有默认网关,这将是正确的。

我想要的只是接收一个 SocketTimeoutException ,即使是客户端同一子网上的错误地址(我的意思是没有侦听服务器或不存在地址的地址)。

我怎样才能获得这种行为?

谢谢

4

2 回答 2

0

这两个例外是有区别的。

1.NoRouteToHostException:

表示尝试将套接字连接到远程地址和端口时发生错误的信号。通常,由于中间防火墙或中间路由器已关闭,无法访问远程主机。

2. Socket超时异常

表示套接字读取或接受发生超时的信号。

所以,如果你有NoRouteToHostException,这意味着该地址无法到达(在你的情况下它可能不存在),如果你有SocketTimeoutException这个地址存在,但你不能连接到特定的端口(那里没有监听) .

于 2013-01-23T21:53:44.140 回答
0

实际上,您无法将这两个条件都包装到一个异常中。问题是这里发生了两件不同的事情。

对于从本地子网发送数据包,运行您的应用程序的系统将使用本地网关将其发送到链中的下一个路由器,依此类推,直到到达目标网络。因为在指定的目标地址没有人,所以什么都不会响应,你会得到一个超时异常。

对于本地子网,系统尝试直接连接到目标地址。这意味着它将首先发送某种 ARP 请求。不幸的是,对此将没有响应,并且系统将不知道如何发送您的数据包,从而导致“我找不到发送此信息的方法”错误。也就是 NoRouteToHost 异常。

不同之处在于,在第一种情况下,系统可以发送请求,但在第二种情况下不能。这就是为什么有两个单独的错误。

于 2013-01-24T23:24:32.190 回答