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

Java InetAddress 類別完整應用教學:IP 與網域名稱解析

     編輯:Java 相關知識

網路層位址解析核心 API

java.net.InetAddress 是 Java 處理 IP 位址與網域名稱的核心類別,封裝了 DNS 解析功能。本文詳細說明 TCP/IP 基礎、InetAddress 核心方法與實務應用範例。

TCP/IP 協定族快速回顧

層級功能關鍵協定
應用層提供網路服務HTTP, FTP, SMTP, DNS, Telnet
傳輸層端到端通訊TCP (可靠), UDP (快速)
網路層路由與定址IP (IPv4/IPv6)
網路介面層實體傳輸Ethernet, Wi-Fi

IP 位址分類

  • A 類:1.0.0.0 - 126.255.255.255(大型網路)
  • B 類:128.0.0.0 - 191.255.255.255(中型網路)
  • C 類:192.0.0.0 - 223.255.255.255(小型網路)
  • D 類:224.0.0.0 - 239.255.255.255(多點廣播)
  • E 類:240.0.0.0 - 254.255.255.255(保留實驗)

常見表示:點分十進制 (192.168.1.1) 或網域名稱 (www.google.com)

InetAddress 核心方法

方法說明回傳值
getByName(String host)根據主機名/域名取得 InetAddressInetAddress
getLocalHost()取得本機 InetAddressInetAddress
getHostName()取得主機名稱String
getHostAddress()取得 IP 位址字串String
getAllByName(String host)取得所有對應 IP(負載平衡常用)InetAddress[]
isReachable(int timeout)測試主機可達性 (Ping)boolean

實務範例

基本解析

public class InetAddressDemo {
    public static void main(String[] args) {
        try {
            // 1. 解析域名
            InetAddress addr = InetAddress.getByName("www.google.com");
            System.out.println("主機名: " + addr.getHostName());
            System.out.println("IP 位址: " + addr.getHostAddress());
            
            // 2. 取得本機資訊
            InetAddress local = InetAddress.getLocalHost();
            System.out.println("本機名: " + local.getHostName());
            System.out.println("本機 IP: " + local.getHostAddress());
            
            // 3. 多 IP 解析 (如 CDN、負載平衡)
            InetAddress[] addrs = InetAddress.getAllByName("www.facebook.com");
            for (InetAddress a : addrs) {
                System.out.println("IP: " + a.getHostAddress());
            }
        } catch (UnknownHostException e) {
            System.err.println("無法解析主機: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("網路錯誤: " + e.getMessage());
        }
    }
}

網路可達性檢測

public static boolean isHostReachable(String host, int timeoutMs) {
    try {
        InetAddress address = InetAddress.getByName(host);
        return address.isReachable(timeoutMs);
    } catch (IOException e) {
        return false;
    }
}

// 使用
if (isHostReachable("192.168.1.1", 3000)) {
    System.out.println("主機可達");
}

進階應用場景

IPv6 支援

InetAddress 同時支援 IPv4 (Inet4Address) 與 IPv6 (Inet6Address):

InetAddress addr = InetAddress.getByName("::1"); // IPv6 回環位址
System.out.println("類別: " + addr.getClass().getSimpleName()); // Inet6Address
System.out.println("IP: " + addr.getHostAddress()); // 0:0:0:0:0:0:0:1

網路介面掃描

結合 NetworkInterface 列舉本機所有網卡 IP:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
    NetworkInterface ni = interfaces.nextElement();
    Enumeration<InetAddress> addresses = ni.getInetAddresses();
    while (addresses.hasMoreElements()) {
        InetAddress addr = addresses.nextElement();
        System.out.println(ni.getName() + " -> " + addr.getHostAddress());
    }
}

常見問題與注意事項

  1. DNS 快取:JVM 預設快取正向解析結果,可透過 networkaddress.cache.ttl 系統屬性調整
  2. 阻塞操作:DNS 解析會阻塞執行緒,高併發場景建議非同步處理或使用快取
  3. 權限需求:isReachable 在某些作業系統需要管理員權限
  4. IPv4/IPv6 雙棧:現代系統多為雙棧,解析可能同時回傳兩類位址
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved