2013-01-23 29 views
0

我編寫了一個簡單的java tcp客戶端。我每次運行客戶端時都會在命令行上指定服務器IP地址。java.net.NoRouteToHostException引發嘗試訪問客戶端的* same *子網上的非現有主機

如果沒有服務器監聽指定的IP地址或IP地址不存在,一個SocketTimeoutException提高。這適用於客戶端運行的子網之外的任何IP地址。如果我在客戶端的相同子網上指定了錯誤的服務器IP地址,則會引發java.net.NoRouteToHostException。

這對我來說很奇怪。將兩個地址歸屬於同一個子網,絕對不需要爲了到達服務器而具有IP路由。如果服務器位於與客戶端不同的子網上,並且運行客戶端的主機沒有默認網關,則情況會如此。

我想即使是簡單地收到一個SocketTimeoutException爲錯誤的地址在客戶端的同一子網什麼(我的意思是,其上有沒有監聽的服務器或不存在的地址,地址)。

我該如何獲得這種行爲?

謝謝

+0

明白了,謝謝澄清。順便說一句,我認爲這個例外是有點誤導性的,因爲雖然我有一條默認路由,但它被引發了。 – pastoreerrante

回答

0

這兩個例外有區別。

1的NoRouteToHostException:試圖將套接字連接到遠程地址和端口時發生錯誤

信號。通常,由於介入防火牆或中間路由器關閉,無法訪問遠程主機。

2. SocketTimeoutException一個超時讀取或接受套接字上發生

信號。

所以,如果你有NoRouteToHostException,這意味着該地址無法到達(在你的情況下,它可能不存在),如果你有SocketTimeoutException這個地址存在,但您無法連接到特定的端口(沒有聽到那裏)。

+0

我明白了你的意思,但在我的情況下,它有點不同。如果我從客戶的子網中指定了不存在的服務器地址,則會引發SocketTimeoutException。如果我在同一客戶端的子網中指定另一個不存在的地址,那麼我有NoRouteToHostException。在這兩種情況下,地址都不存在,但我得到了兩個不同的例外。唯一的區別是地址屬於或不屬於客戶的子網。 – pastoreerrante

+0

這個答案完全錯誤。 NoRouteToHostException意味着它所說的。它指的是本地主機的路由表。它與防火牆或路由器沒有任何關係。嘗試連接時,SocketTimeoutException不會發生。如果沒有人在聽,你會得到一個ConnectException。 -1 – EJP

+0

正如你可以看到這是直接從【JAVA API文檔(http://docs.oracle.com/javase/6/docs/api/java/net/NoRouteToHostException.html) – partlov

0

實事求是地講,你不會要能夠這兩方面的條件包裝成一個例外。問題在於,這裏有兩件獨立的事情。

發包出去的本地子網中,運行你的應用系統將使用它發送到下一個路由器鏈等,直至達到目的網絡的本地網關。因爲在指定的目標地址上沒有人,所以沒有任何迴應,並且您會收到超時異常。

本地子網,系統將嘗試直接連接到目的地址。這意味着它會首先發送某種ARP請求。不幸的是,對此不會有任何反應,系統也不知道如何發送數據包,導致「我無法找到發送出去的方式」的錯誤。又名,NoRouteToHost例外。

所不同的是,在第一種情況下,該系統可以發送請求,但是在第二種情況下不能。這就是爲什麼有兩個單獨的錯誤。

相關問題