2009-04-10 81 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记录。