检查字符串是否是Java中的主机名或IP地址

问题描述:

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

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

虽然理论上你就可以编写规则来自己处理这些情况下,使用的RFCstheusualcadre,我不是看the entirety of this class in Google Guava,尤其是例如它如何解决嵌入4合6地址的问题。

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

+0

它看起来并不像番石榴的类指示一个字符串是否包含一个主机名(非IP地址)。 – Gili 2017-02-17 02:13:42

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

似乎没有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. 否则,它必须是一个短的主机名

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