InetAddress 是 Java 網路層的核心類,代表 IP 位址與主機名的綁定。本例展示如何輕鬆獲取本機資訊,並說明常見陷阱(多網卡、IPv6、回環地址)與進階用法。
public void say() {
try {
InetAddress i = InetAddress.getLocalHost();
System.out.println(i); // 輸出: hostname/ip (例: myPC/192.168.1.100)
System.out.println(i.getHostName()); // 僅主機名
System.out.println(i.getHostAddress()); // 僅 IP 字串
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
gethostname(), Windows: GetComputerName())。/etc/nsswitch.conf (Linux) 或網路設定 (Windows) 影響,通常優先查 /etc/hosts。/etc/hosts 含 127.0.0.1 hostname,將返回 127.0.0.1 而非真實 LAN IP。生產環境常導致服務註冊到錯誤地址。getLocalHost() 只返回一個(通常是第一個非回環 IPv4),不可靠。public static void printAllIps() throws SocketException {
Enumeration nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface ni : Collections.list(nets)) {
if (!ni.isUp() || ni.isLoopback() || ni.isVirtual()) continue; // 過濾關閉/回環/虛擬介面
for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
InetAddress addr = ia.getAddress();
if (addr instanceof Inet4Address) { // 僅 IPv4
System.out.printf("介面: %-10s IP: %-15s 子網掩碼: %d%n",
ni.getName(), addr.getHostAddress(), ia.getNetworkPrefixLength());
}
}
}
}
getLocalHost()。X-Forwarded-For 標頭。