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

Java 網路工具:一行代碼獲取本機主機名與 IP 位址

     編輯:Java 相關知識

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();
    }
}

深度解析:getLocalHost() 背後發生了什麼?

  1. 獲取主機名:呼叫 OS API (Linux: gethostname(), Windows: GetComputerName())。
  2. 解析 IP:透過 DNS 解析主機名 → IP。關鍵點:查找順序受 /etc/nsswitch.conf (Linux) 或網路設定 (Windows) 影響,通常優先查 /etc/hosts。
  3. 回環地址陷阱:若 /etc/hosts 含 127.0.0.1 hostname,將返回 127.0.0.1 而非真實 LAN IP。生產環境常導致服務註冊到錯誤地址。
  4. 多網卡/多 IP:單機可能有 eth0, docker0, vpn, IPv6 等多個介面,getLocalHost() 只返回一個(通常是第一個非回環 IPv4),不可靠。

進階:遍歷所有網卡 IP (推薦生產用法)

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());
            }
        }
    }
}

實戰應用場景

  • 微服務註冊:Eureka/Consul/Nacos 客戶端需上報正確 IP,必須用遍歷網卡邏輯而非 getLocalHost()。
  • 分散式鎖/領導者選舉:節點識別常綁定 IP,需穩定可達的業務網卡 IP。
  • 日誌追蹤:記錄請求處理節點 IP,便於問題定位。
  • 安全審計:記錄登入來源 IP,需注意代理/負載均衡器下的 X-Forwarded-For 標頭。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved