Java - Как определить версию IP

Я получаю IP-адрес Client с помощью метода ниже:

public static String getClientIpAddr(HttpServletRequest request) {  
    String ip = request.getHeader("X-Forwarded-For");  
    ...
    return ip
} 

Теперь я хочу определить, является ли это IPV4 или IPV6.

Ответ 1

Вы можете создать InetAddress и проверить, стал ли он экземпляром ipv4 или ipv6

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It ipv6
} else if (address instanceof Inet4Address) {
    // It ipv4
}

Кажется, это немного неудобно, и я надеюсь, что есть лучшее решение.

Ответ 2

Если вы уверены, что получаете IPv4 или IPv6, вы можете попробовать следующее. Если у вас есть DNS-имя, это попытается выполнить поиск. В любом случае, попробуйте следующее:

try {

    InetAddress address = InetAddress.getByName(myIpAddr);

    if (address instanceof Inet4Address) {
        // your IP is IPv4
    } else if (address instanceof Inet6Address) {
        // your IP is IPv6
    }

} catch(UnknownHostException e) {

    //  your address was a machine name like a DNS name, and couldn't be found

}

Ответ 3

Благодаря Tala.

Вот что я пробовал использовать этот пример с небольшими изменениями:

  private static Pattern VALID_IPV4_PATTERN = null;
  private static Pattern VALID_IPV6_PATTERN = null;
  private static final String ipv4Pattern = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
  private static final String ipv6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}";

  static {
    try {
      VALID_IPV4_PATTERN = Pattern.compile(ipv4Pattern, Pattern.CASE_INSENSITIVE);
      VALID_IPV6_PATTERN = Pattern.compile(ipv6Pattern, Pattern.CASE_INSENSITIVE);
    } catch (PatternSyntaxException e) {
      //logger.severe("Unable to compile pattern", e);
    }
  }

  public static String isIpAddressV4orV6(String ipAddress) {

        Matcher ipv4 = IP_Utilities.VALID_IPV4_PATTERN.matcher(ipAddress);
        if (ipv4.matches()) {
          return "IPV4";
        }
        Matcher ipv6 = IP_Utilities.VALID_IPV6_PATTERN.matcher(ipAddress);
        if (ipv6.matches()) {
              return "IPV6";
        }
        return "";
    }

Ответ 4

Вы можете использовать InetAddresses из google guava. Например, например:

int addressLength = InetAddresses.forString(ip).getAddress().length;
switch (addressLength) {
    case 4:
        System.out.println("IPv4");
        break;
    case 16:
        System.out.println("IPv6");
        break;
    default:
        throw new IllegalArgumentException("Incorrect ip address length " + addressLength);
}