Запрос записей службы DNS для поиска имени хоста и TCP / IP - PullRequest
6 голосов
/ 11 апреля 2009

В статье о идентификаторах наук о жизни (см. 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 ]

18 голосов
/ 25 октября 2009

Поставщик 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». Разделенные пробелом поля расположены по порядку:

  1. приоритет
  2. вес
  3. Порт
  4. Сервер
9 голосов
/ 11 апреля 2009

Вы не можете сделать это, используя стандартные библиотеки Java. Класс InetAddress способен только искать записи DNS A.

Для поиска SRV записей (и любого другого типа записи ресурса DNS, отличного от A записи) вам нужна сторонняя библиотека. dnsjava - это обычный вариант.

Я лично пользовался версией 1.6 на Google Android, она отлично работает. Версия 2.0 и более поздние используют слой Java nio, поэтому не будут совместимы с более ранними версиями JVM.

2 голосов
/ 11 апреля 2009

Я думаю, что вы не можете сделать это без использования внешних библиотек. java.util.InetAddress имеет несколько методов для разрешения имен через DNS, но его можно использовать только для разрешения имен в IP-адресах, а не для общих запросов DNS.

Для этого вам понадобится внешняя библиотека, например DNSJava .

1 голос
/ 25 октября 2009

В случае, если кто-то ищет решения, не относящиеся к Java (которые они могли бы учитывать, что название вопроса не зависит от языка), когда я реализовал LSID (см. doi: 10.1186 / 1751-0473-3 -2 ) Я использовал пакет PEAR Net_DNS , который может искать записи SRV.

...