我可以在InetAddress对象上过滤和选择仅IPV4地址吗?如何排除IPV6?

时间:2013-12-03 14:11:58

标签: java inetaddress

我有以下问题:我创建了一个ArrayList,我在这个arraylist中输入了我客户端的所有IP地址(如果客户端有一个网卡,则为一个,如果客户端在具有n个网卡的PC上运行,则为n)不包括环回地址,点对点地址和虚拟地址。

我这样做了:

private static List<String> allIps = new ArrayList<String>();

static {
    Enumeration<NetworkInterface> nets;
    try {

        nets = NetworkInterface.getNetworkInterfaces();


        while(nets.hasMoreElements()) {

            NetworkInterface current = nets.nextElement();

            if ((current.isUp()) && (!current.isPointToPoint()) && (!current.isVirtual()) && (!current.isLoopback())) {
                System.out.println(current.getName());
                Enumeration<InetAddress> ee = current.getInetAddresses();


                    while (ee.hasMoreElements()) {
                        InetAddress i = ee.nextElement();
                        System.out.println(i.getHostAddress());
                        allIps.add(i.getHostAddress());

                    }
            }
        }
    } catch (SocketException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.println("List of all IP on this client: "
            + allIps.toString());
    System.out.println("Number of ip: " + allIps.size());

}

看起来效果很好,唯一的问题是我的输出(在Eclipse控制台中)是:

eth0
fe80:0:0:0:20c:29ff:fe15:3dfe%2
192.168.15.135
List of all IP on this client: [fe80:0:0:0:20c:29ff:fe15:3dfe%2, 192.168.15.135]
Number of ip: 2

使用调试器和控制台输出对我来说很明显,在这种情况下,唯一存在的网络接口 eth0 (这是可以的)但是,对于这个网络接口,id找到2个IP地址(一个是IPV6地址,第二个是经典的IPV4地址)

所以它放入我的地址列表 allIps

我想选择并在 allIps 列表中仅输入 IPV4 地址,而不是IPV6。我该怎么办呢?我可以在 InetAddress 对象上过滤并仅选择IPV4吗?

TNX

安德烈

1 个答案:

答案 0 :(得分:6)

使用instanceofInet4Address类型:

for (NetworkInterface ni :
                     Collections.list(NetworkInterface.getNetworkInterfaces())) {
  for (InetAddress address : Collections.list(ni.getInetAddresses())) {
    if (address instanceof Inet4Address) {
      System.out.println(address);
    }
  }
}