Java - 如何检测IP版本

tok*_*khi 15 java network-programming servlets

Client通过以下方法获取IP地址:

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

现在我想检测它是一个IPV4还是一个IPV6.

Bex*_*Bex 27

您可以创建一个InetAddress并检查它是否成为ipv4或ipv6实例

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎有点尴尬,我希望有更好的解决方案.

  • 更好的是它不依赖于instanceof.在InetAddress中有一个方法可以返回一个常量来指示正在使用的版本. (4认同)
  • 更好怎么办?它依赖于 JDK 而不是自产的正则表达式。对我来说似乎没问题。 (2认同)

mor*_*ano 8

如果您确定要获得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

}
Run Code Online (Sandbox Code Playgroud)


Vla*_*liy 5

您可以使用 google guava 中的 InetAddresses。例如这样:

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);
}
Run Code Online (Sandbox Code Playgroud)