Проверьте, является ли строка именем хоста или IP-адресом в Java - PullRequest
3 голосов
/ 31 марта 2012

Я хочу проверить, является ли строка именем хоста или IP-адресом в Java. Есть ли API для этого или я сам должен написать парсер?

Проблема является сложной, поскольку существуют адреса IPv4, короткие и длинные адреса IPv6, короткие имена хостов и имена хостов FQDN.

Ответы [ 4 ]

5 голосов
/ 31 марта 2012

Похоже, что 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. В противном случае это должно быть короткое имя хоста
2 голосов
/ 31 марта 2012

Хотя теоретически вы могли бы написать правила для этих случаев самостоятельно, используя обычно кадров из RFC , я бы вместо этогопосмотрите на весь этот класс в Google Guava , особенно в угловых случаях, например, как он разрешает встраивание адресов 4-в-6.

Что касается определения, есть ли у васПолное доменное имя, проверьте, не приводит ли принуждение к IP-адресу, а затем попытайтесь разрешить его для DNS.Что-либо еще, учитывая ваши входные данные, должно быть именем хоста или локальным разрешением, которое не полностью определено.

2 голосов
/ 31 марта 2012

Невозможно в JDK API, но вы можете использовать InetAddresses.forString в google guava , который выдает исключение, когда аргумент не является литералом строки IP.

1 голос
/ 19 октября 2016

Java-библиотека IPAddress сделает это. 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
...