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

Java 網路程式設計精通指南(10):Inet4Address 與 Inet6Address — IPv4/IPv6 類型區分

     編輯:Java 相關知識

Java 通過 Inet4Address、Inet6Address 兩個 final 子類區分 IPv4 與 IPv6 地址,均繼承自 InetAddress。本文講解如何識別地址類型、IPv6 兼容地址判斷及實用代碼模式。

類定義與關係

public final class Inet4Address extends InetAddress  // IPv4
public final class Inet6Address extends InetAddress  // IPv6

兩者分別按協議規範實現父類方法。Inet6Address 額外提供:

public boolean isIPv4CompatibleAddress()  // 判斷是否為 IPv4 兼容地址

IPv4 兼容 IPv6 地址

格式:前 12 字節全 0,後 4 字節為 IPv4 地址。常見寫法:

  • ::ffff:192.168.1.10 (IPv4 映射地址,最常見)
  • ::192.168.1.10 (舊式兼容地址,已棄用)
  • 0:0:0:0:0:ffff:c0a8:010a (全十六進制)

isIPv4CompatibleAddress() 對上述均返回 true。

三種判斷地址類型的方法

1. byte[] 長度 — 最直接

InetAddress addr = InetAddress.getByName("www.example.com");
byte[] bytes = addr.getAddress();
if (bytes.length == 4) System.out.println("IPv4");
else if (bytes.length == 16) System.out.println("IPv6");

2. instanceof — 面向對象風格

if (addr instanceof Inet4Address) System.out.println("IPv4");
else if (addr instanceof Inet6Address) System.out.println("IPv6");

3. 字符串格式 — 簡單粗暴

String host = addr.getHostAddress();
if (host.contains(":")) System.out.println("IPv6"); // 包含冒號
else System.out.println("IPv4");

完整演示代碼

public class IpTypeDetector {
    public static void main(String[] args) throws Exception {
        if (args.length == 0) return;
        InetAddress addr = InetAddress.getByName(args[0]);
        System.out.println("IP: " + addr.getHostAddress());

        // 方法 1: byte 數組長度
        switch (addr.getAddress().length) {
            case 4:  System.out.println("→ byte[] 長度判斷: IPv4"); break;
            case 16: System.out.println("→ byte[] 長度判斷: IPv6"); break;
        }

        // 方法 2: instanceof
        if (addr instanceof Inet4Address)
            System.out.println("→ instanceof 判斷: IPv4");
        else if (addr instanceof Inet6Address)
            System.out.println("→ instanceof 判斷: IPv6");

        // 方法 3: IPv6 兼容檢查 (僅 IPv6)
        if (addr instanceof Inet6Address) {
            Inet6Address ipv6 = (Inet6Address) addr;
            if (ipv6.isIPv4CompatibleAddress())
                System.out.println("→ 此為 IPv4 兼容/映射地址");
        }
    }
}

測試輸出

$ java IpTypeDetector www.csdn.net
IP: 211.100.26.122
→ byte[] 長度判斷: IPv4
→ instanceof 判斷: IPv4

$ java IpTypeDetector www.neu6.edu.cn
IP: 2001:da8:9000:b255:200:e8ff:feb0:5c5e
→ byte[] 長度判斷: IPv6
→ instanceof 判斷: IPv6

$ java IpTypeDetector ::ffff:192.168.1.10
IP: ::ffff:192.168.1.10
→ byte[] 長度判斷: IPv6
→ instanceof 判斷: IPv6
→ 此為 IPv4 兼容/映射地址

實務建議

  • 首選 instanceof,語義清晰且性能極佳 (JVM 優化)。
  • 需序列化/傳輸地址類型時,用 getAddress().length (4/16) 作為標識。
  • 處理 IPv6 映射地址 (::ffff:x.x.x.x) 時,可提取後 4 字節轉為 IPv4 邏輯處理。
  • 系統未安裝 IPv6 協議棧時,getByName 解析 IPv6 域名會拋 UnknownHostException。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved