Java InetAddress
Resuelve y representa direcciones IP en Java con la clase InetAddress.
Toda conexión en esta parte necesitó una dirección — un host y un puerto. java.net.InetAddress es la clase que representa la parte del host: una dirección IP, opcionalmente emparejada con un nombre de host. También es la puerta de entrada al DNS (el Sistema de Nombres de Dominio), que convierte un nombre como example.com en la dirección numérica a la que la red realmente enruta. Este último capítulo de Networking cubre la creación, resolución e inspección de direcciones. Las mismas instancias de InetAddress que construyes aquí son las que pasas a un Socket, un ServerSocket o un DatagramSocket para conectarte realmente.
Sin constructor público — usa métodos de fábrica
Nunca escribirás new InetAddress(...). En su lugar:
InetAddress a = InetAddress.getByName("example.com"); // DNS lookup (or parse a literal)
InetAddress b = InetAddress.getByName("93.184.216.34"); // numeric literal: no DNS
InetAddress[] all = InetAddress.getAllByName("example.com"); // every address for a host
InetAddress lo = InetAddress.getLoopbackAddress(); // 127.0.0.1 / ::1, never fails
InetAddress me = InetAddress.getLocalHost(); // this machine's address
InetAddress c = InetAddress.getByAddress(new byte[]{10,0,0,1}); // from raw bytesDistinción clave: getByName con un nombre de host realiza una consulta DNS (que puede ser lenta o lanzar UnknownHostException sin conexión); con un literal numérico solo lo analiza, sin red. getByAddress construye una dirección a partir de bytes sin ninguna búsqueda.
¿Cuándo usaría esto? Siempre que necesites resolver un nombre antes de conectarte, validar o clasificar una dirección (loopback, privada, multicast), o conservar una dirección en caché para evitar búsquedas DNS repetidas en un camino crítico. Un helper de más alto nivel como la clase URL resuelve los hosts por ti en segundo plano; InetAddress es la capa a la que desciendes cuando necesitas la dirección en sí.
IPv4 e IPv6
InetAddress es el supertipo común; las instancias concretas son Inet4Address (32 bits, 93.184.216.34) o Inet6Address (128 bits, ::1). getAddress() devuelve los bytes sin formato (4 o 16), y getHostAddress() devuelve la forma textual canónica. El código debe tratar ambas familias de forma uniforme a través del tipo InetAddress.
Inspeccionando una dirección
Predicados útiles clasifican una dirección sin ninguna llamada de red: isLoopbackAddress(), isSiteLocalAddress() (rangos privados como 10.x / 192.168.x), isMulticastAddress(), isAnyLocalAddress() (el comodín 0.0.0.0), y isReachable(timeout) (una sonda real tipo ping — el único método aquí que sí toca la red).
Un ejemplo práctico: crear y clasificar direcciones
Este programa crea direcciones de varias formas — loopback, un literal IPv4, bytes sin formato, un literal IPv6 — e inspecciona cada una con los predicados de clasificación. Deliberadamente usa literales y loopback para que funcione sin conexión; la única llamada dependiente de DNS (getLocalHost) está protegida.
Lo que se puede extraer de la ejecución:
- Las direcciones se crearon sin un constructor — cada instancia provino de una fábrica:
getLoopbackAddress,getByName,getByAddress. Ese diseño permite a la JVM almacenar en caché las búsquedas y devolver la subclase correcta (Inet4AddressvsInet6Address) por ti. getByName("93.184.216.34")ygetByName("::1")no realizaron ninguna consulta DNS porque los argumentos eran literales numéricos — el método simplemente los analizó. La misma llamada con un nombre de host habría tocado el DNS, que es el camino lento y con fallos sin conexión; saber qué entradas desencadenan una búsqueda importa para el rendimiento.- El número de bytes sin formato distinguió las familias: la dirección IPv4 reportó 4 bytes, la dirección IPv6 16, y
instanceof Inet6Addressconfirmó el tipo concreto. El código que maneja direcciones de forma genérica trabaja a través del supertipoInetAddressy raramente necesita ramificar según la familia. - Los predicados de clasificación respondieron preguntas estructurales sin red: la dirección loopback dio
trueparaisLoopbackAddress(), y el10.0.0.1construido desde bytes diotrueparaisSiteLocalAddress()(un rango privado). Estas comprobaciones son aritmética pura sobre los bytes de la dirección. getLocalHost()fue envuelto en un try/catch porque puede fallar conUnknownHostExceptioncuando el propio nombre de la máquina no es resoluble. La resolución de direcciones es fundamentalmente una operación de red/DNS que puede fallar, por lo que el código robusto siempre anticipa el caso no resuelto — la misma precaución que cada capítulo de esta parte aplicó a la red en sí.