Java InetAddress
Resolva e represente endereços IP em Java com a classe InetAddress.
Cada conexão nesta parte precisou de um endereço — um host e uma porta. java.net.InetAddress é a classe que representa a parte do host: um endereço IP, opcionalmente combinado com um nome de host. É também a porta de entrada para o DNS (o Sistema de Nomes de Domínio), convertendo um nome como example.com no endereço numérico para o qual a rede realmente roteia. Este capítulo final de Networking aborda a criação, resolução e inspeção de endereços. As mesmas instâncias de InetAddress que você constrói aqui são as que você passa para um Socket, um ServerSocket, ou um DatagramSocket para realmente conectar.
Sem construtor público — use métodos de fábrica
Você nunca escreve new InetAddress(...). Em vez disso:
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 bytesDistinção fundamental: getByName com um nome de host realiza uma consulta DNS (que pode ser lenta ou lançar UnknownHostException quando offline); com um literal numérico apenas analisa, sem rede. getByAddress constrói um endereço a partir de bytes brutos sem nenhuma consulta.
Quando eu usaria isso? Sempre que você precisar resolver um nome antes de conectar, validar ou classificar um endereço (loopback, privado, multicast), ou manter um endereço em cache para evitar consultas DNS repetidas em um caminho crítico. Um auxiliar de nível mais alto como a classe URL resolve hosts para você nos bastidores; InetAddress é a camada para a qual você desce quando precisa do endereço em si.
IPv4 e IPv6
InetAddress é o supertipo comum; as instâncias concretas são Inet4Address (32 bits, 93.184.216.34) ou Inet6Address (128 bits, ::1). getAddress() retorna os bytes brutos (4 ou 16), e getHostAddress() retorna a forma textual canônica. O código deve tratar ambas as famílias de forma uniforme através do tipo InetAddress.
Inspecionando um endereço
Predicados úteis classificam um endereço sem nenhuma chamada de rede: isLoopbackAddress(), isSiteLocalAddress() (intervalos privados como 10.x / 192.168.x), isMulticastAddress(), isAnyLocalAddress() (o curinga 0.0.0.0), e isReachable(timeout) (uma sonda no estilo ping real — o único método aqui que realmente acessa a rede).
Um exemplo prático: construindo e classificando endereços
Este programa cria endereços de várias formas — loopback, um literal IPv4, bytes brutos, um literal IPv6 — e inspeciona cada um com os predicados de classificação. Ele usa deliberadamente literais e loopback para funcionar offline; a única chamada dependente de DNS (getLocalHost) é protegida.
O que observar na execução:
- Os endereços foram criados sem um construtor — cada instância veio de uma fábrica:
getLoopbackAddress,getByName,getByAddress. Esse design permite que a JVM armazene em cache as consultas e retorne a subclasse correta (Inet4AddressvsInet6Address) para você. getByName("93.184.216.34")egetByName("::1")não realizaram nenhuma consulta DNS porque os argumentos eram literais numéricos — o método apenas os analisou. A mesma chamada com um nome de host teria acessado o DNS, que é o caminho lento e que falha quando offline; saber quais entradas acionam uma consulta é importante para o desempenho.- O número de bytes brutos distinguiu as famílias: o endereço IPv4 reportou 4 bytes, o endereço IPv6 reportou 16, e
instanceof Inet6Addressconfirmou o tipo concreto. Código que manipula endereços de forma genérica trabalha através do supertipoInetAddresse raramente precisa ramificar com base na família. - Os predicados de classificação responderam a perguntas estruturais sem rede: o endereço loopback retornou
trueparaisLoopbackAddress(), e o10.0.0.1construído a partir de bytes retornoutrueparaisSiteLocalAddress()(um intervalo privado). Essas verificações são pura aritmética sobre os bytes do endereço. getLocalHost()foi encapsulado em um try/catch porque pode falhar comUnknownHostExceptionquando o próprio nome da máquina não é resolvível. A resolução de endereços é fundamentalmente uma operação de rede/DNS que pode falhar, portanto um código robusto sempre antecipa o caso não resolvido — o mesmo cuidado que cada capítulo desta parte aplicou à própria rede.