2009-04-10 20 views
6

En un artículo sobre los Life Science Identificadores (ver LSID Tester, a tool for testing Life Science Identifier resolution services), el Dr. Roderic DM Página escribió:Consulta de los registros de servicio DNS para encontrar el nombre de host y TCP/IP

Dada la urna LSID: LSID **: ubio.org **: nombre del banco: 11815, consultar el DNS para el registro SRV de _lsid._tcp. ubio.org devuelve animalia.ubio.org:80 como la ubicación del servicio LSID de ubio.org.

he aprendido que puedo vincular a _lsid._tcp.ubio.org animalia.ubio.org:80 utilizando el anfitrión comando en UNIX:

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

¿Cómo puedo hacer esto 'DNS' utilizando la API J2SE de Java (sin una biblioteca java externa, me gustaría una solución liviana)?

Gracias

Respuesta

17

El proveedor DNS JNDI puede buscar registros SRV. Es necesario hacer algo como:

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

Los atributos devueltos son una enumeración de cadenas que parecen "1 0 80 ANIMALIA.ubio.org". Los campos separados por espacios están en orden:

  1. prioridad
  2. peso
  3. puerto
  4. servidor
+0

¡Gracias! Parece interesante ! Voy a probar tu solución más adelante en el WE. :-) – Pierre

+1

Sé que es bastante viejo, pero me gustaría señalar en la "línea 4" que 'this.env' debe ser' env'. +1 Por una buena respuesta, justo lo que necesitaba. <3 –

+1

Gracias @ php_coder_3809625. Fijo. –

2

creo que no se puede hacer sin el uso de algunas bibliotecas externas. java.util.InetAddress tiene algunos métodos para resolver nombres a través de DNS, pero solo se puede usar para resolver nombres en direcciones IP y no para consultas DNS genéricas.

Para eso, necesita alguna biblioteca externa como DNSJava.

8

No puede hacer esto usando las bibliotecas estándar de Java. La clase InetAddress solo es capaz de buscar registros DNS A.

Para buscar registros SRV (y de hecho cualquier otro tipo de registro de recursos DNS que no sea un registro A) necesita una biblioteca de terceros. dnsjava es la opción habitual.

Personalmente he usado la versión 1.6 en Google Android, funciona bien. La versión 2.0 y posteriores usan la capa Java nio, por lo que no serán compatibles con las JVM anteriores.

+0

Hola, estoy tratando de integrar dnsjava-1.6.6 en mi aplicación de Android para poder hacer una resolución SRV. Me pregunto si recopiló todo el paquete dnsjava y extrajo el .jar, ¿o extrajo los archivos fuente relevantes del paquete ... para mantenerlo liviano? Gracias! – adam

+0

en mi caso, acabo de agregar el archivo completo (precompilado) .jar a mi proyecto.Sin embargo, debería ser posible agregar solo los archivos que necesita. – Alnitak

1

En caso de que alguien está buscando soluciones que no son Java (que puede ser que dado que el el título de la pregunta no es específico del idioma), cuando implementé un LSID (ver doi:10.1186/1751-0473-3-2) utilicé el paquete PEAR Net_DNS, que puede buscar registros SRV.

+0

O bien, haga una pregunta autocompuesta para compartir su trabajo. :) –

Cuestiones relacionadas