Используя java.net.InetAddress
, невозможно иметь разрешение имен ipv6, ipv4 и т. Д. Группа статических методов, таких как getByName
и т. Д., Делегирует поиск экземпляру Inet4(or 6)AddressImpl
, который делает
public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException;
Теперь самое интересное: а) все они являются частными / пакетными локальными, поэтому нет способа внедрить классы impl в класс InetAddress. Б) Inet4 (или 6) классы AddressImpl сами по себе являются пакетными.Таким образом, нет никакого способа сказать, сделайте ipv4 или ipv6 поиск / разрешение имен на лету.Я не понимаю, каким образом все точки расширения были заблокированы для этих классов, что делает их действительно очень ограниченными и гибкими.Здесь происходит настоящая чёрная магия, когда класс InetAddress статически инициализирует impls, от чего зависит результат метода isIPv6Supported () ??Моя установка Linux поддерживает ipv6, я могу выполнять поиск DNS для имен хостов ipv6, таких как ipv6.google.com.Буду признателен, если кто-нибудь может указать мне направление хорошей сетевой библиотеки в java для утилит ipv4 / v6, таких как lookup и т. Д.
class InetAddressImplFactory {
static InetAddressImpl create() {
Object o;
if (isIPv6Supported()) {
o = InetAddress.loadImpl("Inet6AddressImpl");
} else {
o = InetAddress.loadImpl("Inet4AddressImpl");
}
return (InetAddressImpl)o;
}
static native boolean isIPv6Supported();
}