2012-01-31 60 views
1

有沒有任何可能的方法來區分在線IP地址與本地/其他機器IP在局域網上的Java?如何在Java中區分在線IP地址與本地IP /其他機器IP在局域網

我正在應用程序中,需要識別用戶輸入的本地IP/LAN IP和在線IP地址。

在此先感謝。

+0

這不是很清楚,您想從外部WAN獲取機器的LAN IP?如果是這樣,你不能;當您使用NAT時,您只能看到外部IP。 – Viruzzo 2012-01-31 13:05:33

+0

不,我需要知道如何區分在線和離線IP地址從應用程序工作到在線和離線工作。用戶只需提供IP,名稱和密碼。 – Kishore 2012-01-31 13:07:45

+0

您必須通過IP地址的子網檢查它並將其與主機的IP地址進行比較。如果它位於同一子網中,則該IP地址與您的本地子網處於同一子網中。否則,它位於遠程子網上。無論如何,你在線和離線的意思是什麼? – ecle 2012-01-31 13:28:36

回答

3

據我所知,沒有辦法單獨基於IP(這不是專用於Java,而是基於網絡的工作方式)。

但是,如果您有其他信息,您可能可以執行此操作。有三個IP地址網絡未在互聯網上使用。這些都是:

10.0.0.0/8 
172.16.0.0/12 
192.168.0.0/16 

如果你知道局域網IP地址會從特定範圍(包括網絡主機是在您的應用程序是捉迷藏),你可以區分;然而 - 不要在家裏試試這個孩子,因爲它會讓你頭疼 - 如果你使用局域網中也用在互聯網上的IP地址,你不僅會遇到地址衝突,還會麻煩區分在線和局域網IP地址。


雖然有其他的東西;如果您的用戶嘗試通過互聯網「連接」,但是位於NAT後面,則您的應用程序只會將其流量來源視爲爲用戶執行NAT的網關的公共IP。因此,例如,如果您的兩個用戶位於IP地址爲10.0.1.0/24的局域網中,但其網關的公有IP爲123.123.123.123,則您的應用將看到兩個用戶的IP爲123.123.123.123

如果您打算以類似於VPN的方式使用此功能,或者您必須知道位於NAT後面的所有用戶的所有網關的所有公共IP,則可能需要採用不同的身份驗證方式。


了一份關於術語,如馬塞洛指出:據我所知,「在線」和「離線」通常不與IP地址使用的術語。我們更傾向於說「公共」(在互聯網上看到的)和「私人」IP(互聯網上沒有人可以看到的那些IP)。

+1

海事組織它甚至更好地說「局域網地址」和「廣域網地址」。至於這個問題,區分局域網地址的唯一方法是檢查他們是否在這三個範圍內。 Bach指定 – Viruzzo 2012-01-31 15:14:35

+0

局域網和廣域網可能與Kishore描述的含義一致;嚴格來說,雖然我認爲這不合適,但你也可以擁有私人廣域網。 ,廣域網與公衆不是同義的,局域網也不是私有的,我也有點不喜歡廣域網和局域網這兩個術語,因爲它們含糊不清,並且沒有暗示除互聯網連接之外可能存在訪問障礙,但那些是我個人對這些術語的問題;在社區中,它們可能比私人和公共場合更普遍 – 2012-01-31 20:01:49

+0

誠然,在用戶的LAN和Internet之間也可能有一個或多個WAN:最大的高速ISP使用一個這樣的廣域網(這當然會給P2P和遊戲帶來很多問題,但我離題了);不是不可能的(例如在大學裏)有嵌套的局域網。這就是爲什麼我問他爲什麼他需要區分這兩者。 – Viruzzo 2012-02-01 09:23:56

0

您可以使用某些API(如http://automation.whatismyip.com/n09230945.asp)獲取外部IP。如果您可以訪問該API並獲取IP,則您是「在線」的 - 即連接到互聯網。如果你不能,你是「脫機」(除非主機停機等)。

如果您需要在本地主機,您可以使用

InetAddress thisIp =InetAddress.getLocalHost(); 
System.out.println("IP:"+thisIp.getHostAddress()) 

請澄清一下,你認爲「離線IP地址」,因爲我從來沒有聽說過這樣的概念之前。

+0

小心給出downvote的原因?我看不出馬塞洛說錯了什麼。 – 2012-01-31 20:03:13

+0

我剛剛得到127.0.0.1 :( – 2012-04-04 04:35:03