Могу ли я фильтровать и выбирать только адреса IPV4 в объекте InetAddress? Как исключить IPV6?

У меня следующая проблема: я создаю ArrayList и помещаю в этот массив все IP-адреса моего клиента (один, если у клиента есть одна сетевая карта, n, если клиент работает на ПК с 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. Что я могу сделать, чтобы сделать это? Могу ли я отфильтровать и выбрать только IPV4 для моего объекта InetAddress?

Tnx

Андреа


person AndreaNobili    schedule 03.12.2013    source источник


Ответы (1)


Используйте instanceof и тип Inet4Address:

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