7

Roderic DM Page 博士在一篇关于生命科学标识符的论文(参见LSID Tester,一种用于测试生命科学标识符解析服务的工具)中写道:

给定 LSID urn:lsid**:ubio.org**:namebank:11815,在 DNS 中查询 _lsid._tcp 的 SRV记录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 来做这个“DNS”事情(没有任何外部 Java 库,我想要一个轻量级的解决方案)?

谢谢

4

4 回答 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. 服务器
于 2009-10-25T05:35:53.577 回答
11

使用标准 Java 库无法做到这一点。该类InetAddress只能查找 DNSA记录。

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

我个人在 Google Android 上使用过 1.6 版本,效果很好。2.0 及更高版本使用 Javanio层,因此与早期的 JVM 不兼容。

于 2009-04-11T14:49:44.587 回答
2

我认为如果不使用一些外部库,您将无法做到这一点。java.util.InetAddress有一些通过 DNS 解析名称的方法,但它仅可用于将名称解析为 IP 地址,而不能用于通用 DNS 查询。

为此,您需要一些外部库,例如DNSJava

于 2009-04-10T20:26:27.330 回答
0

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

于 2009-10-25T19:03:58.090 回答