Я пытаюсь преобразовать строки в Inetaddress
. Я не пытаюсь разрешать имена хостов: строки - это ipv4-адреса. Работает ли InetAddress.getByName(String host)
? Или мне нужно вручную разобрать его?
Есть ли простой способ преобразования String в Inetaddress в Java?
Ответ 1
com.google.common.net.InetAddresses.forString(String ipString)
лучше для этого, так как он не будет выполнять поиск DNS независимо от того, какая строка передана ему.
Ответ 2
Да, это сработает. API очень ясно говорит об этом ( "Имя хоста может быть либо именем машины, например" java.sun.com ", либо текстовое представление его IP-адреса." ), и, конечно, вы можете легко проверить себя.
Ответ 3
Остерегайтесь: кажется, что разбор недействительного адреса, такого как InetAddress.getByName("999.999.999.999"
), не приведет к исключению, как можно было бы ожидать из фразы документации:
проверяется достоверность формата адреса
Эмпирически я получаю экземпляр InetAddress с локальным IP-адресом локальной машины и недопустимым IP-адресом в качестве имени хоста. Конечно, это было не то, что я ожидал!
Ответ 4
Вы можете попробовать использовать регулярное выражение для отфильтровывания нечисловых IP-адресов перед передачей String
в getByName()
. Тогда getByName()
не будет пытаться разрешить имя.
Ответ 5
Библиотека Java с открытым исходным кодом IPAddress проверит все стандартные представления IPv6 и IPv4 и сделает это без поиска DNS. Отказ от ответственности: я являюсь менеджером проекта этой библиотеки.
Следующий код будет выполнять то, что вы запрашиваете:
String s = "1.2.3.4";
try {
IPAddressString str = new IPAddressString(s);
IPAddress addr = str.toAddress();
InetAddress inetAddress = addr.toInetAddress(); //IPv4 or IPv6
if(addr.isIPv4() || addr.isIPv4Convertible()) {//IPv4 specific
IPv4Address ipv4Addr = addr.toIPv4();
Inet4Address inetAddr = ipv4Addr.toInetAddress();
//use address
}
} catch(AddressStringException e) {
//e.getMessage has validation error
}