Преобразование строки в 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
}