2009-04-10 18 views
6

w artykule o Life Science Identyfikatory (patrz LSID Tester, a tool for testing Life Science Identifier resolution services), dr Roderic DM Page napisał:sprawdzania rekordów DNS usługi, aby znaleźć nazwę hosta i TCP/IP

Biorąc pod urnę LSID: lsid **: ubio.org **: namebank: 11815, wysyła zapytanie do DNS rekordu SRV dla _lsid._tcp. ubio.org zwraca animalia.ubio.org:80 jako lokalizację usługi LSR ubio.org.

dowiedziałem się, że mogę połączyć _lsid._tcp.ubio.org do animalia.ubio.org:80 pomocą hosta polecenie na UNIX:

host -t srv _lsid._tcp.ubio.org 
_lsid._tcp.ubio.org has SRV record 1 0 80 ANIMALIA.ubio.org 

Jak mogę zrobić to '' DNS używając Java J2SE API (bez zewnętrznej biblioteki Java, chciałbym mieć lekkie rozwiązanie)?

Dziękuję

Odpowiedz

17

Dostawca DNS JNDI może wyszukiwać rekordy SRV. Musisz zrobić coś takiego:

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" }); 

Zwracany atrybuty są wyliczenie ciągi, które wyglądają jak „1 0 80 ANIMALIA.ubio.org”. Pola przestrzeń oddzielone są w kolejności:

  1. priorytetowej
  2. waga
  3. portu
  4. serwer
+0

Dzięki! Wygląda ciekawie ! Przetestuję twoje rozwiązanie później w WE. :-) – Pierre

+1

Wiem, że jest dość stary, ale chciałbym zauważyć w "linii 4", że 'ten.env' powinien być' env'. +1 Na dobrą odpowiedź, tylko to, czego potrzebowałem. <3 –

+1

Dzięki @ php_coder_3809625. Naprawiony. –

2

myślę, że nie może tego zrobić bez korzystania z niektórych zewnętrznych bibliotek. java.util.InetAddress ma kilka metod rozpoznawania nazw za pośrednictwem DNS, ale można go używać tylko do rozpoznawania nazw na adresy IP, a nie do generowania zapytań DNS.

Do tego potrzebna jest biblioteka zewnętrzna, taka jak DNSJava.

8

Nie można tego zrobić przy użyciu standardowych bibliotek Java. Klasa InetAddress może wyszukiwać tylko rekordy DNS A.

Aby wyszukać rekordy SRV (a także każdy inny typ rekordu zasobu DNS inny niż rekord A), potrzebna jest biblioteka innej firmy. dnsjava to standardowa opcja.

Osobiście użyłem wersji 1.6 na Google Android, działa dobrze. Wersja 2.0 i nowsze używają warstwy Java nio, więc nie będą kompatybilne z wcześniejszymi maszynami JVM.

+0

Witam, próbuję zintegrować dnsjava-1.6.6 z moją aplikacją dla systemu Android, aby uzyskać rozdzielczość SRV. Zastanawiam się, czy skompilowałeś cały pakiet dnsjava i wciągnąłeś .jar - czy też wyodrębniłeś odpowiednie pliki źródłowe z pakietu ... aby zachować lekkość? Dzięki! – adam

+0

w moim przypadku właśnie dodałem cały (wstępnie skompilowany) plik .jar do mojego projektu.Jednak powinno być możliwe dodawanie tylko tych plików, których potrzebujesz. – Alnitak

1

W przypadku ktokolwiek szuka rozwiązań niż Java (które mogą zważywszy, że tytuł pytania nie jest specyficzny dla danego języka), kiedy zaimplementowałem LSID (zobacz doi:10.1186/1751-0473-3-2) użyłem pakietu PEAR Net_DNS, który może wyszukać rekordy SRV.

+0

Możesz też odpowiedzieć samodzielnie, aby udostępnić swoją pracę. :) –