2009-04-10 108 views
6

在有關生命科學標識符紙(見LSID Tester, a tool for testing Life Science Identifier resolution services),羅德里克博士DM頁寫道:查詢DNS服務記錄查找主機名和TCP/IP

鑑於LSID甕:LSID **: ubio.org **:namebank:11815,查詢DNS的SRV記錄_lsid._tcpubio.org返回animalia.ubio.org:80作爲ubio.org LSID服務的位置。

我才知道,我可以鏈接_lsid._tcp.ubio.org在UNIX上使用主機命令animalia.ubio.org:80:

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庫,我想要一個輕量級的解決方案)?

謝謝

回答

17

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. 服務器
+0

謝謝!看起來很有趣!我將在稍後的WE中測試您的解決方案。 :-) – Pierre 2009-10-25 08:47:36

2

我認爲你不能使用一些外部庫。 java.util.InetAddress有一些通過DNS解析名稱的方法,但它只能用於將名稱解析爲IP地址,而不能用於通用DNS查詢。

爲此,您需要一些外部庫,如DNSJava

8

你不能使用標準的Java庫來做到這一點。 InetAddress類只能查找DNS A記錄。

要查找SRV記錄(以及除A記錄之外的任何其他DNS資源記錄類型),您需要第三方庫。 dnsjava是通常的選擇。

我個人在谷歌Android上使用1.6版本,它工作正常。版本2.0和更高版本使用Java nio層,因此不會與先前的JVM兼容。

+0

您好,我正在嘗試將dnsjava-1.6.6整合到我的Android應用程序中,以便執行SRV解析。我想知道,你編譯了整個dnsjava包,並拉入.jar - 或者你從包中提取相關的源文件....以保持它輕量級? 謝謝! – adam 2009-06-18 15:28:05

+0

在我的情況我剛剛添加了整個(預編譯).jar文件到我的項目。但是,只需添加所需的文件應該是可行的。 – Alnitak 2009-06-18 16:57:14

1

如果有人正在尋找非Java的解決方案(他們可能會考慮到問題的標題不是特定於語言的),當我實現LSID時(請參閱doi:10.1186/1751-0473-3-2),我使用了PEAR包Net_DNS,它可以查找SRV記錄。