Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中检查字符串是主机名还是ip地址_Java_String_Ip Address_Hostname - Fatal编程技术网

在Java中检查字符串是主机名还是ip地址

在Java中检查字符串是主机名还是ip地址,java,string,ip-address,hostname,Java,String,Ip Address,Hostname,我想检查字符串是主机名还是Java中的ip地址。是否有API可以实现这一点,或者我必须自己编写解析器 问题很复杂,因为存在IPv4地址、短IPv6地址和长IPv6地址、短主机名和FQDN主机名。在JDK API中不可能,但可以使用InetAddresses。forString在其中,当参数不是IP字符串文字时引发异常。似乎没有API,但是编写这样的函数似乎并不困难。您可以在代码中检查以下条件: 如果sourceStr包含“:”但不包含“->IPv6 如果sourceStr.matches(“^.

我想检查字符串是主机名还是Java中的ip地址。是否有API可以实现这一点,或者我必须自己编写解析器


问题很复杂,因为存在IPv4地址、短IPv6地址和长IPv6地址、短主机名和FQDN主机名。

在JDK API中不可能,但可以使用
InetAddresses。forString
在其中,当参数不是IP字符串文字时引发异常。

似乎没有API,但是编写这样的函数似乎并不困难。您可以在代码中检查以下条件:

  • 如果sourceStr包含“:”但不包含“->IPv6
  • 如果sourceStr.matches(“^.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}”)==true)->IPv4
  • 如果sourceStr包含“”->FQDN主机名
  • 否则,它必须是短主机名

  • 虽然理论上你可以自己编写规则来处理这些情况,但使用,我会看一看,尤其是一些特殊情况,比如它如何解决4/6地址的嵌入问题

    至于确定是否有FQDN,请查看对IP地址的强制是否失败,然后尝试根据DNS解决该问题。考虑到您的输入情况,任何其他内容都应该是主机名或本地解析,而不是完全限定的。

    就可以了。javadoc可以在链接中找到。免责声明:我是项目经理

    static void check(HostName host) {
        try {
            host.validate();
            if(host.isAddress()) {
                System.out.println("address: " + host.asAddress());
            } else {
                System.out.println("host name: " + host);
            }
        } catch(HostNameException e) {
            System.out.println(e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        HostName host = new HostName("1.2.3.4");
        check(host);
        host = new HostName("1.2.a.4");
        check(host);
        host = new HostName("::1");
        check(host);
        host = new HostName("[::1]");
        check(host);
        host = new HostName("1.2.?.4");
        check(host);  
    }
    
    输出:

    address: 1.2.3.4
    host name: 1.2.a.4
    address: ::1
    address: ::1
    1.2.?.4 Host error: invalid character at index 4
    

    要扩展@MrGomez的答案,请使用验证IP地址和验证主机名(FQDN)

    例如:

    public static boolean validate(final String hostname) {
            return InetAddresses.isUriInetAddress(hostname) || InternetDomainName.isValid(hostname);
        }
    
    导入sun.net.util.IPAddressUtil
    IPAddressUtil.isIPv4LiteralAddress(地址)
    IPAddressUtil.isIPv6LiteralAddress(地址)
    
    看起来Guava的类并没有指明字符串是否包含主机名(非IP地址)。您应该编辑该类以添加对这些命令作用的解释,仅仅将代码发布为解决方案是没有帮助的。虽然此代码可以回答问题,提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。