在 TCP/IP 網路環境下,查詢本機 IP 或解析網域名稱對應的 IP 是常見需求。雖然作業系統提供 ipconfig / ifconfig、ping 等指令,但在圖形化應用程式或 Applet 中呼叫外部指令會破壞使用者體驗且有安全限制。Java 核心函式庫 java.net.InetAddress 提供了純 Java、跨平台的解決方案。
| 方法 | 說明 |
|---|---|
static InetAddress getLocalHost() | 取得本機 InetAddress 物件 (主機名 + IP) |
static InetAddress getByName(String host) | 解析主機名/網域名稱取得 IP |
String getHostAddress() | 取得 IP 位址字串 (如 "192.168.1.100") |
String getHostName() | 取得主機名稱 |
import java.net.*;
public class NetTool {
public static void main(String[] args) {
NetTool tool = new NetTool();
System.out.println("本機 IP: " + tool.getMyIP());
System.out.println("伺服器 IP (www.example.com): " + tool.getServerIP());
}
// 取得本機 IP
public String getMyIP() {
try {
InetAddress local = InetAddress.getLocalHost();
return local.getHostAddress(); // 僅回傳 IP 字串
} catch (UnknownHostException e) {
return "無法解析本機: " + e.getMessage();
}
}
// 解析指定網域 IP
public String getServerIP(String hostname) {
try {
InetAddress remote = InetAddress.getByName(hostname);
return remote.getHostAddress();
} catch (UnknownHostException e) {
return "無法解析 " + hostname + ": " + e.getMessage();
}
}
// 重載預設查詢 www.abc.com
public String getServerIP() {
return getServerIP("www.abc.com");
}
}
getLocalHost() 通常回傳回環位址 (127.0.0.1) 或第一張網卡 IP。若需列舉所有網卡 IP:
NetworkInterface.getNetworkInterfaces()
.asIterator()
.forEachRemaining(ni -> ni.getInetAddresses()
.asIterator()
.forEachRemaining(ia -> System.out.println(ni.getName() + " -> " + ia.getHostAddress())));
使用 InetAddress.getAllByName(String host) 取得陣列:
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress addr : addresses) System.out.println(addr.getHostAddress());
getCodeBase().getHost()),無法 任意解析外部網域或連接其他 IP。InetAddress 同時代表 IPv4 (Inet4Address) 與 IPv6 (Inet6Address),getHostAddress() 會回傳標準格式 (IPv6 含方括號如 [::1])。
將上述邏輯封裝為獨立工具類 (NetworkUtils),搭配單元測試 (Mock InetAddress 或使用嵌入式 DNS 伺服器),即可安全地整合到 Spring Boot 微服務、Android App 或 JavaFX 桌面應用中。記住:網路呼叫必須在非 UI 執行緒 (如 ExecutorService, CompletableFuture) 執行,避免阻塞主執行緒導致介面凍結。