Как определить, является ли строка IP-адресом или именем хоста

StackOverflow https://stackoverflow.com/questions/66923

  •  09-06-2019
  •  | 
  •  

Вопрос

Итак, у вас есть строка, полученная из веб-интерфейса администратора (так что это определенно строка).Как узнать, является ли эта строка IP-адресом или именем хоста в Java?

Обновлять:Думаю, я не совсем ясно выразился, я больше спрашивал, есть ли в Java SDK что-нибудь, что я могу использовать для различения IP-адресов и имен хостов?Извините за путаницу и спасибо всем, кто нашел/найдет время, чтобы ответить на этот вопрос.

Это было полезно?

Решение

Вы можете использовать регулярное выражение с этим шаблоном:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Это скажет вам, является ли это адресом IPv4.

Другие советы

Можем ли мы предположить, что это является то или другое, а не что-то совсем другое?Если да, то я бы, вероятно, использовал регулярное выражение, чтобы проверить, соответствует ли оно формату «точечный четырехугольник».

Вы можете увидеть, соответствует ли строка формату номер.номер.номер.номер, например:

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

будет соответствовать чему-либо из 0 - 999.

Во всем остальном вы можете указать имя хоста по умолчанию.

URI validator = new URI(yourString);

Этот код проверит IP-адрес или имя хоста.(Он выдает неправильное исключение URI, если строка недействительна)

Если вы пытаетесь различить эти два понятия... тогда я скучаю по вашему вопросу.

Не могли бы вы просто сопоставить его с регулярным выражением?

Вы можете использовать менеджер безопасности с InetAddress.getByName(addr) вызов.

Если адрес не является квадратом с точками, getByName попытается выполнить соединение для поиска имени, которое менеджер безопасности может захватить как checkConnect(addr, -1) вызов, что приводит к выдаче SecurityException, которое вы можете перехватить.

Вы можете использовать System.setSecurityManager() если вы используете полные привилегии для вставки своего собственного менеджера безопасности перед getByName звонок сделан.

Это не так просто, как может показаться: существуют некоторые двусмысленности вокруг таких символов, как дефисы, подчеркивание и квадратные скобки «-», «_», «[]».

Java SDK имеет некоторые ограничения в этой области.При использовании InetAddress.getByName он выходит в сеть, чтобы выполнить разрешение DNS-имени и разрешить адрес, что является дорогостоящим и ненужным, если все, что вам нужно, это определить хост и адрес.Кроме того, если адрес записан в немного другом, но допустимом формате (распространенном в IPv6), сравнение строк по результатам InetAddress.getByName не будет работать.

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top