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

Java 網絡編程:InetAddress 獲取域名 IP 地址完整實現

     編輯:Java 相關知識

核心 API:java.net.InetAddress

InetAddress 代表 IP 地址 (IPv4/IPv6),提供域名解析、本地地址獲取等靜態工廠方法。

完整代碼實現

import java.net.InetAddress;
import java.net.UnknownHostException;

public class DomainIpResolver {

    /** 獲取本機 IP 地址 */
    public InetAddress getLocalhostIP() {
        try {
            return InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            throw new RuntimeException("獲取本機 IP 失敗", e);
        }
    }

    /** 獲取域名對應的所有 IP 地址 (支持多 IP 負載均衡) */
    public InetAddress[] getServerIPs(String domain) {
        try {
            return InetAddress.getAllByName(domain);
        } catch (UnknownHostException e) {
            throw new RuntimeException("域名解析失敗: " + domain, e);
        }
    }

    /** 獲取首個 IP 地址字符串 */
    public String getFirstIp(String domain) {
        InetAddress[] addresses = getServerIPs(domain);
        return addresses.length > 0 ? addresses[0].getHostAddress() : null;
    }

    public static void main(String[] args) {
        DomainIpResolver resolver = new DomainIpResolver();
        
        // 本機 IP
        System.out.println("本機 IP: " + resolver.getLocalhostIP().getHostAddress());
        
        // 域名解析
        String domain = "www.163.com";
        System.out.println("域名: " + domain);
        
        InetAddress[] ips = resolver.getServerIPs(domain);
        for (int i = 0; i < ips.length; i++) {
            System.out.printf("IP %d: %s%n", i + 1, ips[i].getHostAddress());
        }
        System.out.println("總計: " + ips.length + " 個 IP");
    }
}

關鍵方法解析

方法說明返回
getLocalHost()獲取本機 InetAddress (主機名 → IP)InetAddress
getAllByName(String host)DNS 查詢獲取所有關聯 IP (A/AAAA 記錄)InetAddress[]
getByName(String host)獲取首個 IPInetAddress
getHostAddress()獲取 IP 字符串 (如 192.168.1.1)String
getHostName()獲取主機名 (反向解析)String

異常處理最佳實踐

  • UnknownHostException:DNS 解析失敗 (域名不存在、網絡不可達、DNS 故障)
  • 建議封裝為非檢查異常或返回 Optional<InetAddress[]>,避免調用處到處 try-catch
  • 生產環境可加入緩存 (Guava Cache / Caffeine) 減少 DNS 查詢開銷

進階用法

1. 判斷 IP 版本

InetAddress addr = InetAddress.getByName("www.google.com");
boolean isIPv6 = addr instanceof Inet6Address; // 或 addr.getAddress().length == 16

2. 遍歷網絡接口獲取所有本機 IP

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

3. 達到超時控制 (Java 18+)

// Java 18 引入解析器配置
var resolver = InetAddressResolver.getDefault();
resolver.resolve("example.com").get(5, TimeUnit.SECONDS);

總結

InetAddress 提供了簡潔的 DNS 解析能力,核心掌握 getAllByName() 獲取多 IP (支持 CDN/負載均衡場景) 與異常處理。現代應用建議結合異步 DNS (Netty Resolver) 或緩存層提升性能。

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