【问题标题】:Check if a string is a hostname or an ip-address in Java检查字符串是Java中的主机名还是IP地址
【发布时间】:2012-04-14 19:08:42
【问题描述】:

我想检查一个字符串是 Java 中的主机名还是 IP 地址。是否有 API 可以做到这一点,还是我必须自己编写解析器?

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

【问题讨论】:

    标签: java string ip-address hostname


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        虽然理论上您可以自己编写规则来处理这些情况,但使用 the usual cadreRFCs,我会改为查看 the entirety of this class in Google Guava,尤其是极端情况,例如它如何解决嵌入 4-in-6 地址。

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

        【讨论】:

        • Guava 的类好像没有指示String 是否包含主机名(非IP 地址)。
        【解决方案4】:

        The IPAddress Java library 会做到的。链接中提供了 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
        

        【讨论】:

          【解决方案5】:

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

          例子:

          public static boolean validate(final String hostname) {
                  return InetAddresses.isUriInetAddress(hostname) || InternetDomainName.isValid(hostname);
              }
          

          【讨论】:

            【解决方案6】:
            import sun.net.util.IPAddressUtil
            IPAddressUtil.isIPv4LiteralAddress(addr)
            IPAddressUtil.isIPv6LiteralAddress(addr)
            

            【讨论】:

            • 您应该编辑它以添加对这些命令的作用的解释,只是发布代码作为解决方案没有帮助。
            • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
            猜你喜欢
            • 2012-07-28
            • 1970-01-01
            • 2010-09-09
            • 2014-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-25
            • 2011-03-23
            相关资源
            最近更新 更多