在Java中检查有效的IPv4地址

时间:2011-09-26 05:01:28

标签: java string ipv6 ipv4

我正在使用sun.net.util.IPAddressUtil包检查字符串是否包含有效的IPv4和IPv6地址。

代码段是: -

String ipv4addr="200";

    if(IPAddressUtil.isIPv4LiteralAddress(ipv4addr))
    {
        System.out.println("valid ipv4 address");
    }
    else
    {
        System.out.println("not valid");

    }

但对于诸如200和300之类的地址,它仍然说它是有效的IPv4地址,但实际上并非如此。 当我使用相同的包并使用以下方法检查IPV6地址时: -

String ipv6addr="200";

    if(IPAddressUtil.isIPv6LiteralAddress(ipv6addr))
    {
        System.out.println("valid ipv6 address");
    }
    else
    {
        System.out.println("not valid");

    }

我得到了正确的结果。但是,IPv4似乎没有工作,或者可能是我错误地使用它。请指导我。我不想使用正则表达式进行IPv4验证...

6 个答案:

答案 0 :(得分:23)

您获得“有效”结果的原因是:200 是有效的IPv4地址。

请参阅计算机,IPv4地址只是一个32位数字。这些点完全是为了我们的方便,因为我们人类很难记住大的精确数字。但他们不必在那里;有关于如何解析地址的规则取决于它有多少部分。

当一个地址由一个数字组成时,它被认为是一个32位数字,每个字节是该数字的8位。如果您要将"200"解析为IP地址,则它将等于0.0.0.200。同样,"2130706433"相当于127.0.0.1。

当地址有两个部分如0.200(第一部分是第一个字节,第二部分是表示其他3个字节的24位数字),甚至0.0.200(前两个数字)时,也有标准是字节,最后一部分是16位,占用其他2个字节)。 “异常”格式是IP地址类时代的遗留物,但几乎所有必须解析地址的软件都会理解它们。 (例如,如果您弹出浏览器并转到http://1249739112 * 或甚至http://74.125.33128 * ,Google的主页就会出现。)

*请参阅可点击链接的评论。谢谢,“链接验证器”。 :P

有关详细信息,请参阅http://download.oracle.com/javase/6/docs/api/java/net/Inet4Address.htmlhttp://www.perlmonks.org/?node_id=221512http://en.wikipedia.org/wiki/IPv4#Address_representations

Java也理解这些格式(和.net一样,以及任何体面的操作系统),并正确解析地址,无论它包含1,2,3或4个部分。

如果你想检查一个可能的地址实际上是“xxx.xxx.xxx.xxx”,那么你可能想要使用模式或使用认为32-的验证库来明确检查位数作为无效地址(即使它们有效)。不过我不打扰 - 如果你使用提供的查找功能,你可以接受任何标准格式的地址,它会起作用。

(所有这些混乱都会随着IPv6的变化而变化;格式更加严格,您不能只输入一些36位数字并期望它能够正常工作。但是平台仍然知道如何解析地址,你应该相信它会这样做。)

答案 1 :(得分:3)

查看Guava's InetAddresses类,其中包含用于处理IP地址的静态实用程序方法。 (据我所知,它在幕后使用sun.net.util.IPAddressUtil类。)

System.out.println(InetAddresses.isInetAddress("400")); // false

答案 2 :(得分:2)

使用内部“sun”打包类不是一个好主意,我尝试使用Apache的Validator

http://commons.apache.org/validator/

具有IP地址验证。

答案 3 :(得分:1)

如果要验证字符串是否是有效的IP地址表示,org.apache.http.conn.util.InetAddressUtils的源代码使用这些正则表达式:

IPV4_PATTERN = Pattern.compile(
    "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
IPV6_STD_PATTERN = Pattern.compile(
    "^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$");
IPV6_HEX_COMPRESSED_PATTERN = Pattern.compile(
    "^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$");

答案 4 :(得分:0)

经过一个小小的研究后,我最终得到了类似的东西

    public static boolean isValidIP4Address(String ipAddress) {
        if (ipAddress.matches("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$")) {
            String[] groups = ipAddress.split("\\.");

            for (int i = 0; i <= 3; i++) {
                String segment = groups[i];
                if (segment == null || segment.length() <= 0) {
                    return false;
                }

                int value = 0;
                try {
                    value = Integer.parseInt(segment);
                } catch (NumberFormatException e) {
                    return false;
                }
                if (value > 255) {
                    return false;
                }
            }
            return true;
        }
        return false;
    }

这对于简单的检查很好。

答案 5 :(得分:0)

该字符串是一种IPv4字符串格式,最初由BSD Unix中的aton_inet实用程序引入,并且一直持续到今天的各种Unix和Linux版本以及其他地方。

https://linux.die.net/man/3/inet_aton

The IPAddress Java library将进行验证,可以配置为支持aton_inet格式。链接中提供了javadoc。免责声明:我是项目经理。

验证地址是否有效,允许inet_aton样式:

    String str = "200";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         System.out.println("valid address: " + addr.toCanonicalString());
    } catch(IPAddressStringException e) {
        System.out.println(e.getMessage());
    }

输出:

有效地址:0.0.0.200

验证地址是否有效,不允许使用inet_aton样式:

    IPAddressStringParameters parameters = new       
      IPAddressStringParameters.Builder().allow_inet_aton(false).toParams();
    addrString = new IPAddressString(str, parameters);
    try {
         IPAddress addr = addrString.toAddress();
         System.out.println("valid address: " + addr.toCanonicalString());
    } catch(IPAddressStringException e) {
        System.out.println(e.getMessage());
    }

输出:

200 IP地址错误:选项不允许少于四个段的IPv4地址