InetAddress 代表 IP 地址 (IPv4/IPv6),提供域名解析、本地地址獲取等靜態工廠方法。
import java.net.InetAddress;
import java.net.UnknownHostException;
public class DomainIpResolver {
/** 獲取本機 IP 地址 */
public InetAddress getLocalhostIP() {
try {
return InetAddress.getLocalHost();
} catch (UnknownHostException e) {
throw new RuntimeException("獲取本機 IP 失敗", e);
}
}
/** 獲取域名對應的所有 IP 地址 (支持多 IP 負載均衡) */
public InetAddress[] getServerIPs(String domain) {
try {
return InetAddress.getAllByName(domain);
} catch (UnknownHostException e) {
throw new RuntimeException("域名解析失敗: " + domain, e);
}
}
/** 獲取首個 IP 地址字符串 */
public String getFirstIp(String domain) {
InetAddress[] addresses = getServerIPs(domain);
return addresses.length > 0 ? addresses[0].getHostAddress() : null;
}
public static void main(String[] args) {
DomainIpResolver resolver = new DomainIpResolver();
// 本機 IP
System.out.println("本機 IP: " + resolver.getLocalhostIP().getHostAddress());
// 域名解析
String domain = "www.163.com";
System.out.println("域名: " + domain);
InetAddress[] ips = resolver.getServerIPs(domain);
for (int i = 0; i < ips.length; i++) {
System.out.printf("IP %d: %s%n", i + 1, ips[i].getHostAddress());
}
System.out.println("總計: " + ips.length + " 個 IP");
}
}
| 方法 | 說明 | 返回 |
|---|---|---|
getLocalHost() | 獲取本機 InetAddress (主機名 → IP) | InetAddress |
getAllByName(String host) | DNS 查詢獲取所有關聯 IP (A/AAAA 記錄) | InetAddress[] |
getByName(String host) | 獲取首個 IP | InetAddress |
getHostAddress() | 獲取 IP 字符串 (如 192.168.1.1) | String |
getHostName() | 獲取主機名 (反向解析) | String |
UnknownHostException:DNS 解析失敗 (域名不存在、網絡不可達、DNS 故障)Optional<InetAddress[]>,避免調用處到處 try-catchInetAddress addr = InetAddress.getByName("www.google.com");
boolean isIPv6 = addr instanceof Inet6Address; // 或 addr.getAddress().length == 16
NetworkInterface.getNetworkInterfaces()
.asIterator()
.forEachRemaining(ni -> ni.getInetAddresses()
.asIterator()
.forEachRemaining(ia -> System.out.println(ia.getHostAddress())));
// Java 18 引入解析器配置
var resolver = InetAddressResolver.getDefault();
resolver.resolve("example.com").get(5, TimeUnit.SECONDS);
InetAddress 提供了簡潔的 DNS 解析能力,核心掌握 getAllByName() 獲取多 IP (支持 CDN/負載均衡場景) 與異常處理。現代應用建議結合異步 DNS (Netty Resolver) 或緩存層提升性能。