Запрашивая записи службы DNS, чтобы найти имя хоста и TCP/IP
В своей статье об идентификаторах биологических наук (см. LSID Tester, инструмент для тестирования служб разрешения идентификаторов биологических наук) доктор Родерик Д.М. Пейдж написал:
Учитывая LSID urn:lsid**:ubio.org**:namebank:11815, запрашивая DNS для записи SRV для _lsid._tcp.ubio.org возвращает animalia.ubio.org:80 в качестве местоположения службы LSID ubio.org.
Я узнал, что могу связать _lsid._tcp.ubio.org с animalia.ubio.org:80, используя команду host в unix:
host -t srv _lsid._tcp.ubio.org
_lsid._tcp.ubio.org has SRV record 1 0 80 ANIMALIA.ubio.org
Как я могу сделать эту вещь "DNS", используя Java J2SE API (без какой-либо внешней библиотеки Java, я бы хотел облегченное решение)?
Спасибо
4 ответа
Поставщик JNDI DNS может искать записи SRV. Вам нужно сделать что-то вроде:
Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
env.put("java.naming.provider.url", "dns:");
DirContext ctx = new InitialDirContext(env);
Attributes attrs = ctx.getAttributes("_lsid._tcp.ubio.org", new String[] { "SRV" });
Возвращаемые атрибуты являются перечислением строк, которые выглядят как "1 0 80 ANIMALIA.ubio.org". Разделенные пробелом поля расположены по порядку:
- приоритет
- вес
- порт
- сервер
Вы не можете сделать это, используя стандартные библиотеки Java. InetAddress
класс способен только искать DNS A
записей.
Смотреть вверх SRV
записи (и на самом деле любой другой тип записи ресурса DNS, кроме A
запись) вам нужна сторонняя библиотека. dnsjava
это обычный вариант.
Я лично использовал версию 1.6 на Google Android, она отлично работает. Версия 2.0 и позже используют Java nio
слой, поэтому не будет совместим с более ранними JVM.
Я думаю, что вы не можете сделать это без использования внешних библиотек. java.util.InetAddress имеет несколько методов для разрешения имен через DNS, но он используется только для разрешения имен в IP-адресах, а не для общих DNS-запросов.
Для этого вам понадобится внешняя библиотека, такая как DNSJava.
В случае, если кто-то ищет решения, не относящиеся к Java (которые они могли бы учитывать, что название вопроса не зависит от языка), когда я реализовал LSID (см. http://dx.doi.org/10.1186/1751-0473-3-2), я использовал Пакет PEAR Net_DNS, который может искать записи SRV.