【问题标题】:Some doubts about how to retrieve multiple IP addresses (if I have more than one network card) in Java?关于如何在 Java 中检索多个 IP 地址(如果我有多个网卡)的一些疑问?
【发布时间】:2013-12-19 10:49:33
【问题描述】:

我在检索客户端的 ip 时遇到以下 2 个问题。

我在一个类中创建了以下代码:

private static InetAddress thisIp;

static{
    try {
        thisIp  = InetAddress.getLocalHost();
        System.out.println("MyIp is: " + thisIp);
    } catch(UnknownHostException ex) {

    }
}

我的问题是:

1) 前面的代码应该检索客户端的 IP 地址,当我执行它时会打印以下消息:

MyIp 是:andrea-virtual-machine/127.0.1.1

为什么它以 andrea-virtual-machine/ 开头? (我在虚拟机上开发),有问题吗?

2) 通过这种方式,我只能检索一个 IP 地址,但我可以拥有多个网卡,因此我可以拥有多个 IP 地址,但多个 IP 地址

我能做些什么来处理这种情况?我想将所有多个IP地址放入一个ArrayList

Tnx

安德烈亚

【问题讨论】:

    标签: java networking ip-address


    【解决方案1】:
    1. 不,这不是问题,它只是一个由主机名和 IP (hostname/ip) 组成的输出。您可能想要阅读的细节:InetAddress 类中的方法 toString() 被实现为返回此格式。

    2. 以下代码将列出您系统中每个接口的所有 IP 地址(并​​将它们存储在一个列表中,然后您可以传递等等...):

      public static void main(String[] args) throws InterruptedException, IOException
      {
          List<String> allIps = new ArrayList<String>();
          Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
          while (e.hasMoreElements())
          {
              NetworkInterface n = e.nextElement();
              System.out.println(n.getName());
              Enumeration<InetAddress> ee = n.getInetAddresses();
              while (ee.hasMoreElements())
              {
                  InetAddress i = ee.nextElement();
                  System.out.println(i.getHostAddress());
                  allIps.add(i.getHostAddress());
              }
          }
      }
      

    boolean isLoopbackAddress() 方法允许您过滤可能不需要的环回地址。

    返回的InetAddress要么是Inet4Address要么是Inet6Address,使用instanceof可以判断返回的IP是IPv4还是IPv6格式。

    【讨论】:

    • Tnx,但我对您的代码有最后一个疑问:我在其中插入了 2 个 println,它只是打印 allIps 列表的大小及其内容,我收到此消息:List of all IP on此客户端:[fe80:0:0:0:20c:29ff:fe15:3dfe%2, 192.168.15.135, 0:0:0:0:0:0:0:1%1, 127.0.0.1] 数量ip: 4 那么为什么这个列表包含 4 个 IP?我只有一张网卡...其他ips代表什么?
    • 是的,这些是您系统的 4 个 IP 地址,其中两个是 IPv4 格式,两个是 IPv6 格式。一个是localhost接口,一个是连接网络的。
    • mmm 我认为这对我不利,我只需要与服务器交互的所有“经典”IP 的列表,在我的情况下,列表必须只包含 192.168.15.135 ,如果我有多个网卡,IP 地址列表必须只包含具有这种形式的地址...我该怎么办?
    • 我用两种可以帮助您实现这一目标的方法更新了我的答案。
    • 好的...我已经了解如何使用 isLoopbackAddress() 方法来排除环回地址,但在我看来 InetAddress 没有提供您所说的 getFamily() 方法。 ..你确定吗?
    【解决方案2】:

    顺便说一下,IP 前面列出的主机名是 INetAddress 的一部分。你得到了名字和地址,因为你没有尝试只显示地址。

    【讨论】:

      【解决方案3】:

      如果你的系统配置了多个ip,那么就这样做吧。

      try {
        InetAddress inet = InetAddress.getLocalHost();
        InetAddress[] ips = InetAddress.getAllByName(inet.getCanonicalHostName());
        if (ips  != null ) {
          for (int i = 0; i < ips.length; i++) {
            System.out.println(ips[i]);
          }
        }
      } catch (UnknownHostException e) {
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 2015-10-23
        • 2012-05-26
        • 2013-09-08
        • 2021-10-18
        相关资源
        最近更新 更多