首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 取得本機與遠端 IP 位址實作指南:InetAddress 實戰

     編輯:Java 程式設計入門

前言

在 TCP/IP 網路環境下,查詢本機 IP 或解析網域名稱對應的 IP 是常見需求。雖然作業系統提供 ipconfig / ifconfig、ping 等指令,但在圖形化應用程式或 Applet 中呼叫外部指令會破壞使用者體驗且有安全限制。Java 核心函式庫 java.net.InetAddress 提供了純 Java、跨平台的解決方案。

核心 API 速覽

方法說明
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");
    }
}

進階應用與注意事項

1. 多網卡環境下的本機 IP

getLocalHost() 通常回傳回環位址 (127.0.0.1) 或第一張網卡 IP。若需列舉所有網卡 IP:

NetworkInterface.getNetworkInterfaces()
    .asIterator()
    .forEachRemaining(ni -> ni.getInetAddresses()
        .asIterator()
        .forEachRemaining(ia -> System.out.println(ni.getName() + " -> " + ia.getHostAddress())));

2. 網域名稱解析多 IP (Round Robin DNS)

使用 InetAddress.getAllByName(String host) 取得陣列:

InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress addr : addresses) System.out.println(addr.getHostAddress());

3. Applet / 沙箱限制

  • 未簽名 Applet 僅能連回原始伺服器 (getCodeBase().getHost()),無法 任意解析外部網域或連接其他 IP。
  • 簽名 Applet (JAR 簽名 + 用戶授權) 可突破限制,但現代瀏覽器已停用 Applet 支援。

4. IPv6 支援

InetAddress 同時代表 IPv4 (Inet4Address) 與 IPv6 (Inet6Address),getHostAddress() 會回傳標準格式 (IPv6 含方括號如 [::1])。

從工具類到實戰模組

將上述邏輯封裝為獨立工具類 (NetworkUtils),搭配單元測試 (Mock InetAddress 或使用嵌入式 DNS 伺服器),即可安全地整合到 Spring Boot 微服務、Android App 或 JavaFX 桌面應用中。記住:網路呼叫必須在非 UI 執行緒 (如 ExecutorService, CompletableFuture) 執行,避免阻塞主執行緒導致介面凍結。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved