使用Java获取当前机器的IP地址

问题:

我正在尝试开发一个系统,其中在不同的系统上运行不同的节点或在同一系统上的不同端口上运行。
现在所有的节点都创建一个带目标IP的Socket作为被称为引导节点的特殊节点的IP。节点然后创建自己的ServerSocket并开始侦听连接。
引导节点维护节点列表,并在查询时返回它们。
现在我需要的是节点必须将其IP注册到引导节点。一旦客户端连接到引导节点的ServerSocket,但我没有使用cli.getInetAddress(),我尝试使用cli.getInetAddress()

  1. 我需要客户端注册其PPP IP;
  2. 否则LAN IP可用;
  3. 否则它必须注册127.0.0.1,假设它是相同的计算机。

使用代码:

System.out.println(Inet4Address.getLocalHost().getHostAddress());

要么

System.out.println(InetAddress.getLocalHost().getHostAddress());

我的PPP连接IP地址是:117.204.44.192,但上面给我的是192.168.1.2
 编辑
我正在使用以下代码:

Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
    NetworkInterface n = (NetworkInterface) e.nextElement();
    Enumeration ee = n.getInetAddresses();
    while (ee.hasMoreElements())
    {
        InetAddress i = (InetAddress) ee.nextElement();
        System.out.println(i.getHostAddress());
    }
}

我能够获取所有NetworkInterface的所有IP地址,但是如何区分它们?这是我得到的输出:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

回答:

这在一般情况下可能有点棘手。
从表面上看,InetAddress.getLocalHost()应该给你这个主机的IP地址。问题是主机可能有很多网络接口,并且接口可以绑定到多个IP地址。最重要的是,并不是所有的IP地址都可以在您的机器或LAN之外访问。例如,它们可以是虚拟网络设备的IP地址,专用网络IP地址等。
这意味着InetAddress.getLocalHost()返回的IP地址可能不是正确的IP地址。
你怎么处理这个?

  • 一种方法是使用NetworkInterface.getNetworkInterfaces()获取主机上的所有已知网络接口,然后迭代每个NI的地址。
  • 另一种方法是(以某种方式)获得主机的外部广告FQDN,并使用InetAddress.getByName()查找主IP地址。 (但是如何得到它,以及如何处理基于DNS的负载平衡器?)
  • 前一个变体是从配置文件或命令行参数获取首选的FQDN。
  • 另一个变体是从配置文件或命令行参数获取首选IP地址。

总而言之,InetAddress.getLocalHost()通常可以工作,但是您可能需要为在“复杂”网络环境中运行代码的情况提供一种替代方法。

我能够获得与所有网络接口相关联的所有IP地址,但是如何区分它们?

  • 127.xxx.xxx.xxx范围内的任何地址都是一个“环回”地址。它只对“这个”主机是可见的。
  • 192.168.xxx.xxx范围内的任何地址都是私有(也称为站点本地)IP地址。这些保留供组织内使用。同样适用于10.xxx.xxx.xxx地址,172.16.xxx.xxx到172.31.xxx.xxx。
  • 169.254.xxx.xxx范围内的地址是本地IP地址。这些保留用于单个网段。
  • 地址范围为224.xxx.xxx.xxx至239.xxx.xxx.xxx是多播地址。
  • 地址255.255.255.255是广播地址。
  • 任何其他should都是一个有效的公共点对点IPv4地址。

事实上,InetAddress API提供了测试环回,链接本地,站点本地,组播和广播地址的方法。您可以使用这些来整理您回收的IP地址最合适。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Getting the IP address of the current machine using Java

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

69 + = 71