查询DNS服务记录以查找主机名和TCP/IP。

9

在一篇关于生命科学标识符的论文中(请参见LSID Tester, a tool for testing Life Science Identifier resolution services),Roderic DM Page博士写道:

给定LSID urn:lsid**:ubio.org**:namebank:11815,查询_DNS_ SRV记录以获取_lsid._tcp.ubio.org,将返回animalia.ubio.org:80作为ubio.org LSID服务的位置。

我了解到可以使用unix上的host命令将_lsid._tcp.ubio.org链接到animalia.ubio.org:80。

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

如何使用Java J2SE API(不需要任何外部Java库,我想要一个轻量级的解决方案)来进行DNS操作?

谢谢

4个回答

19

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. 服务器

谢谢!看起来很有趣!我会在周末后测试你的解决方案。 :-) - Pierre
1
我知道这很老了,但是我想在第4行上指出this.env应该是env。对于好的回答加1,正是我所需要的。 <3 - php_coder_3809625

11

使用标准Java库无法实现此操作。 InetAddress类只能查找DNS A记录。

要查找SRV记录(以及除A记录之外的任何其他DNS资源记录类型),您需要使用第三方库。dnsjava是通常的选择。

我个人在Google Android上使用过1.6版本,它可以正常工作。 2.0版本及更高版本使用Java nio层,因此不兼容早期的JVM。


你好,我正在尝试将dnsjava-1.6.6集成到我的Android应用程序中,以进行SRV解析。我想知道,您是编译了整个dnsjava包并拉入.jar文件,还是从包中提取了相关的源文件...以保持轻量级?谢谢! - adam
在我的情况下,我只是将整个(预编译的).jar文件添加到了我的项目中。不过,只添加你需要的文件也是可行的。 - Alnitak

2
我认为你不能在不使用一些外部库的情况下完成它。java.util.InetAddress 有一些通过 DNS 解析名称的方法,但仅可用于将名称解析为 IP 地址,而不能用于通用的 DNS 查询。
为此,你需要像 DNSJava 这样的外部库。

0
如果有人正在寻找非Java解决方案(鉴于问题的标题不是语言特定的,他们可能会这样做),当我实现LSID(参见doi:10.1186/1751-0473-3-2)时,我使用了PEAR包Net_DNS,它可以查找SRV记录。

或者,您可以自己提出一个问题并回答它来分享您的工作。 :) - php_coder_3809625

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接