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

时间:2012-03-31 07:59:03

标签: java string ip-address hostname

我想检查字符串是Java中的主机名还是ip地址。是否有API可以执行此操作,还是我必须自己编写解析器?

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

示例:

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

答案 5 :(得分:0)

render_template