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

Java 網路程式設計精通指南(2):InetAddress 四大靜態工廠方法 — 創建 IP 地址對象完全指南

     編輯:Java 相關知識

InetAddress 無 public 構造器,必須通過 4 個靜態工廠方法創建實例。本文系統講解 getLocalHost、getByName、getAllByName、getByAddress 的參數、異常、返回值差異及適用場景。

方法總覽

方法參數返回異常核心特點
getLocalHost()無InetAddressUnknownHostException獲取本機地址,多 IP 只返回第一個
getByName(String host)域名/IPInetAddressUnknownHostException最常用,域名自動 DNS 解析,多 IP 返回第一個
getAllByName(String host)域名/IPInetAddress[]UnknownHostException返回所有解析 IP,含 IPv4/IPv6 混合
getByAddress(byte[] addr)byte[] (4或16字節)InetAddressUnknownHostException純本地構造,**無 DNS 查詢**,IP 可不存在
getByAddress(String host, byte[] addr)主機名 + byte[]InetAddressUnknownHostException指定關聯主機名 (別名),無 DNS 查詢

1. getLocalHost() — 本機地址

InetAddress local = InetAddress.getLocalHost();
System.out.println(local); // 輸出: ComputerName/192.168.18.10 (toString 格式: hostName/IP)

toString() 實現:hostName + "/" + getHostAddress()。

多 IP 機器只返回第一個,需用 getAllByName(hostName) 獲取全部。

2. getByName(String host) — 單 IP 解析

// 域名
InetAddress addr = InetAddress.getByName("www.csdn.net"); // 返回第一個 IP
System.out.println(addr); // www.csdn.net/211.100.26.124

// 本機名
InetAddress addr2 = InetAddress.getByName("ComputerName"); // 等同 getLocalHost()

// localhost
InetAddress addr3 = InetAddress.getByName("localhost"); // 127.0.0.1

// hosts 文件映射 (C:\Windows\System32\drivers\etc\hosts)
// 192.168.18.100 www.mysite.com
InetAddress addr4 = InetAddress.getByName("www.mysite.com"); // www.mysite.com/192.168.18.100

// 直接傳 IP 字符串 (無 DNS 查詢,不驗證 IP 有效性)
InetAddress addr5 = InetAddress.getByName("129.42.58.212"); // /129.42.58.212 (hostName 為空)

3. getAllByName(String host) — 全量 IP 解析

InetAddress[] addrs = InetAddress.getAllByName("www.csdn.net");
for (InetAddress a : addrs) System.out.println(a);
// 輸出 4 個 IP:
// www.csdn.net/211.100.26.124
// www.csdn.net/211.100.26.121
// www.csdn.net/211.100.26.122
// www.csdn.net/211.100.26.123
關鍵發現:getByName(host) 內部實現即 getAllByName(host)[0]。

傳 IP 給 getAllByName

InetAddress[] addrs = InetAddress.getAllByName("211.100.26.122");
// 輸出單個: /211.100.26.122 (hostName 為空)

4. getByAddress(byte[] addr) — 純本地構造

**零網路開銷**,不驗證 IP 合法性/可達性,僅構造對象。數組長度必須為 4 (IPv4) 或 16 (IPv6)。

// 重載 1: 僅 IP 字節
byte[] ip = {(byte)141, (byte)146, 8, 66}; // 141.146.8.66
InetAddress addr1 = InetAddress.getByAddress(ip);
System.out.println(addr1); // /141.146.8.66

// 重載 2: 指定關聯主機名 (別名)
InetAddress addr2 = InetAddress.getByAddress("Oracle官方網站", ip);
System.out.println(addr2); // Oracle官方網站/141.146.8.66
第二重載的 host 參數**不觸發 DNS**,僅作為顯示別名存入對象。可傳任意字符串。

異常處理指南

  • UnknownHostException:域名不存在、DNS 故障、getByAddress 數組長度非 4/16。
  • 所有方法均拋出此檢查異常,必須 try-catch 或 throws。
  • 傳 IP 字符串給 getByName/getAllByName **永不拋出** UnknownHostException (即使 IP 不存在)。

選擇指南

場景推薦方法理由
獲取本機 IPgetLocalHost()最直接
獲取本機所有 IPgetAllByName(getLocalHost().getHostName())繞過 getLocalHost 單 IP 限制
域名解析 (單 IP 足夠)getByName(domain)簡潔,內部緩存
域名解析 (需所有 IP、負載均衡)getAllByName(domain)獲取完整解析集合
已知 IP 字節 (配置文件、協議解析)getByAddress(bytes)零 DNS,極快,適合熱路徑
需關聯顯示名稱 (日志、UI)getByAddress(name, bytes)封裝別名,無網路開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved