Преобразование строки в InetAddress без поиска DNS

У меня есть локальный IP-адрес в десятичной системе с точками в String. Я хочу преобразовать его в InetAddress, чтобы передать его в Socket, но мне нужно сделать это, не выполняя поиск DNS (потому что это может вызвать длительные таймауты).

Есть ли готовый метод для этого или мне нужно разделить String и создать InetAddress из его байтов?

Обновление. Методы factory InetAddress.getByName() и InetAddress.getByAddress(), похоже, не подходят, поскольку оба они также принимают имена хостов, такие как java.sun.com. Нельзя сказать, будут ли они пытаться связаться с DNS-сервером в своей реализации.

Ответы

Ответ 1

Сделайте это как

InetAddress inetAddress = InetAddress.getByName("192.168.0.105");

Если задан литеральный IP-адрес, только действительность адреса формат.

исходный код java

// if host is an IP address, we won't do further lookup    
if (Character.digit(host.charAt(0), 16) != -1 || (host.charAt(0) == ':')) {

}

Ответ 2

Вы можете использовать Guava InetAddresses#forString(), который специально задокументирован для вашего прецедента:

Возвращает InetAddress с заданным строковым представлением.
Это преднамеренно избегает всех запросов службы имен (например, DNS).

(выделено курсивом)

Ответ 3

Вы можете сделать это, используя метод getByName. например:

InetAddress localhost = InetAddress.getByName("127.0.0.1")

Как описано в java-документах:

Имя хоста может быть либо именем машины, например "java.sun.com", либо текстовым представлением его IP-адреса. Если задан литеральный IP-адрес, проверяется только правильность формата адреса.

Ответ 4

Библиотека Java с открытым исходным кодом IPAddress проверит все стандартные представления IPv6 и IPv4 и сделает это без поиска DNS. Отказ от ответственности: я являюсь менеджером проекта этой библиотеки.

Следующий код будет выполнять то, что вы запрашиваете:

        String str = "fe80:0:0:0:f06c:31b8:cd17:5a44";
        try {
            IPAddressString str = new IPAddressString(str);
            IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup
            InetAddress inetAddr = addr.toInetAddress();//convert valid address
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }