java - code - Convertir una cadena a InetAddress sin búsqueda de DNS
ip server java (4)
Tengo una dirección IP local en notación decimal punteada en una String
. Quiero convertirlo en una InetAddress
para alimentarlo a Socket
, pero necesito hacerlo sin hacer una búsqueda de DNS (porque esto puede causar tiempos de espera prolongados).
¿Hay un método listo para eso, o necesito dividir la String
y crear la InetAddress
desde sus bytes?
Actualización Los métodos de fábrica InetAddress.getByName()
e InetAddress.getByAddress()
no parecen ser un buen ajuste, ya que ambos también aceptan nombres de host como java.sun.com
. No se dice si intentarán ponerse en contacto con un servidor DNS en su implementación.
Hazlo así
InetAddress inetAddress = InetAddress.getByName("192.168.0.105");
Si se proporciona una dirección IP literal, solo se comprueba la validez del formato de dirección.
código fuente java
// if host is an IP address, we won''t do further lookup if (Character.digit(host.charAt(0), 16) != -1 || (host.charAt(0) == '':'')) { }
Puede usar InetAddresses#forString()
Guava, que está específicamente documentada para su caso de uso:
Devuelve la dirección
InetAddress
con la representación de cadena dada.
Esto evita deliberadamente todas las búsquedas de servicios de nombres (por ejemplo, no DNS).
(énfasis añadido)
Puedes hacer esto usando el método getByName. por ejemplo:
InetAddress localhost = InetAddress.getByName("127.0.0.1")
Como se describe en los documentos java:
El nombre de host puede ser un nombre de máquina, como "java.sun.com", o una representación textual de su dirección IP. Si se proporciona una dirección IP literal, solo se comprueba la validez del formato de dirección.
La biblioteca Java de dirección IP de código abierto validará todas las representaciones estándar de IPv6 e IPv4 y lo hará sin búsqueda de DNS. Descargo de responsabilidad: Soy el administrador de proyectos de esa biblioteca.
El siguiente código hará lo que está solicitando:
String str = "fe80:0:0:0:f06c:31b8:cd17:5a44";
try {
IPAddressString str = new IPAddressString(str);
IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup
InetAddress inetAddr = addr.toInetAddress();//convert valid address
//use address
} catch(AddressStringException e) {
//e.getMessage has validation error
}