检查Java中的有效IPv4地址

检查Java中的有效IPv4地址,java,string,ipv6,ipv4,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

我正在使用
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验证…

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


它具有IP地址验证。

获得“有效”结果的原因是:
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
*,例如,谷歌的主页将出现。)

*有关可单击的链接,请参见注释。谢谢,“链接验证程序”。:P

有关更多详细信息,请参见或

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

如果您想检查一个可能的地址是否看起来像“xxx.xxx.xxx.xxx”,那么您可能需要使用一个模式,或者使用一个将32位数字视为无效地址(即使它们是有效的)的验证库来显式检查它。不过,我不想麻烦——如果您使用提供的查找函数,您可以接受任何标准格式的地址,并且可以正常工作

(所有这些乱七八糟的事情都随着IPv6而改变;有一种更严格的格式,你不能仅仅键入36位数字就指望它能工作。但是平台仍然知道如何解析地址,你应该相信它会这样做。)

签出类,它包含用于处理IP地址的静态实用程序方法。(据我所知,它在幕后使用了
sun.net.util.IPAddressUtil
类。)


经过一个小小的研究,我最终得到了这样的结果

    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;
    }
public静态布尔值isValidIP4Address(字符串ipAddress){
if(ipAddress.matches(“^(\\d{1,3})\\。(\\d{1,3})\\。(\\d{1,3})\\。(\\d{1,3})\。”){
String[]groups=ipAddress.split(“\\”);

对于(int i=0;i如果要验证字符串是否为有效的IP地址表示形式,的源代码将使用以下正则表达式:

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})*)?)$");

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

将进行可配置为支持或不支持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());
    }
    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());
    }
输出:

有效地址:0.0.0.200

验证地址是否有效,不允许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());
    }
    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地址少于四个段

是。.我浏览了此链接…但我认为他们没有为此软件包提供任何新版本,或者提到的任何方法都已被弃用…我想最好使用apache公共库进行这些验证…有什么建议吗?可能有重复吗应该注意的是,IPv6地址的规则要严格得多。@Joachim:注意到了。不过,说实话,我高度怀疑有太多的人会在短期内尝试验证IPv6地址:)这只意味着许多人将使用未经验证的IPv6地址。它们将出现,如果您的软件不支持它们,那么您将落后。我听到“IPv6即将出现”已经超过10年了。仍在等待。如果没有隧道代理,我甚至无法让IPv6正常工作P@chao:原文:(例如,如果你打开浏览器,进入或甚至打开谷歌主页。)这是我在浏览IPV4验证时看到的第一个软件包。但是我不想一开始就使用它。但似乎没有其他选择…是的,这对IPV4地址非常有效。但是我想从命令行接受Ipv6地址。要检查Ipv6地址,我只能看到isIsatapAddress(Inet6Address ip)方法。不确定如何从字符串中获取Inet6address对象…@Thomas我回答中的代码只测试IP地址。请改为签出。