2012-01-31 58 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