InetAddress 類詳解

InetAddress 類詳解

一、核心作用
  • 封裝 IP 地址:同時支持 IPv4 和 IPv6 地址
  • 域名解析:將域名轉換為 IP 地址(DNS 查詢)
  • 地址驗證:檢查網絡地址的有效性
  • 無構造方法:通過靜態工廠方法獲取實例

二、核心方法

方法作用描述
static InetAddress getByName(String host)通過主機名/IP字符串獲取實例(可能觸發DNS查詢)
static InetAddress[] getAllByName(String host)獲取主機的所有IP地址
static InetAddress getLocalHost()獲取本地主機地址
String getHostName()獲取主機名(可能觸發反向DNS查詢)
String getHostAddress()獲取IP地址字符串
boolean isReachable(int timeout)測試地址可達性(ICMP ping)

三、基礎使用示例

1. 獲取單個地址
import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo {public static void main(String[] args) {try {// 通過域名獲取InetAddress googleAddr = InetAddress.getByName("www.google.com");System.out.println("Google IP: " + googleAddr.getHostAddress());System.out.println("Host Name: " + googleAddr.getHostName());// 通過IP地址獲取InetAddress ipAddr = InetAddress.getByName("142.250.179.196");System.out.println("Host for 142.250.179.196: " + ipAddr.getHostName());} catch (UnknownHostException e) {System.err.println("Address resolution failed: " + e.getMessage());}}
}
2. 獲取所有地址(多IP場景)
// 獲取某個域名的所有IP地址
try {InetAddress[] baiduAddrs = InetAddress.getAllByName("www.baidu.com");System.out.println("\nBaidu IPs:");for (InetAddress addr : baiduAddrs) {System.out.println(" - " + addr.getHostAddress());}
} catch (UnknownHostException e) {e.printStackTrace();
}
3. 獲取本機地址
try {InetAddress localHost = InetAddress.getLocalHost();System.out.println("\nLocal Host:");System.out.println("Name: " + localHost.getHostName());System.out.println("IP: " + localHost.getHostAddress());
} catch (UnknownHostException e) {e.printStackTrace();
}

四、運行結果示例

Google IP: 142.250.179.196
Host Name: www.google.com
Host for 142.250.179.196: fra24s01-in-f4.1e100.netBaidu IPs:- 110.242.68.3- 110.242.68.4Local Host:
Name: My-Computer.local
IP: 192.168.1.100

五、特殊地址處理

1. 回環地址驗證
InetAddress loopback = InetAddress.getByName("localhost");
System.out.println("Is loopback: " + loopback.isLoopbackAddress()); // true
2. IPv6 地址處理
InetAddress ipv6Addr = InetAddress.getByName("2001:4860:4860::8888");
System.out.println("IPv6 Address: " + ipv6Addr.getHostAddress());
3. 地址可達性測試
InetAddress target = InetAddress.getByName("www.github.com");
boolean reachable = target.isReachable(5000); // 5秒超時
System.out.println("Is reachable: " + reachable);

六、注意事項

  1. DNS 查詢開銷

    • getHostName() 可能觸發反向 DNS 查詢
    • 頻繁調用需考慮性能影響
  2. 緩存機制

    • JVM 默認緩存 DNS 查詢結果
    • 緩存時間由 networkaddress.cache.ttl 屬性控制
  3. 異常處理

    • 必須捕獲 UnknownHostException
    • 常見觸發場景:
      • 無效域名
      • 無網絡連接
      • DNS 服務器不可達
  4. IPv4/IPv6 兼容性

    • 優先使用系統默認協議棧
    • 可通過 JVM 參數控制:
      -Djava.net.preferIPv4Stack=true
      -Djava.net.preferIPv6Addresses=true
      

七、實際應用場景

1. 驗證 IP 地址格式
public static boolean isValidIP(String ip) {try {InetAddress.getByName(ip);return true;} catch (UnknownHostException e) {return false;}
}
2. 獲取本機真實 IP(非回環地址)
public static String getRealLocalIP() {try {return InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {return "127.0.0.1";}
}
3. 批量地址解析
public static void resolveAddresses(List<String> hosts) {hosts.forEach(host -> {try {InetAddress[] addresses = InetAddress.getAllByName(host);System.out.println(host + " : " + Arrays.stream(addresses).map(InetAddress::getHostAddress).collect(Collectors.joining(", ")));} catch (UnknownHostException e) {System.err.println("Cannot resolve: " + host);}});
}

八、與 NetworkInterface 結合使用

import java.net.NetworkInterface;
import java.util.Enumeration;// 獲取本機所有網絡接口的IP地址
public static void listAllIPs() {try {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());}}} catch (Exception e) {e.printStackTrace();}
}

通過掌握 InetAddress 類的使用,開發者可以:

  • 實現靈活的網絡地址管理
  • 處理域名解析與反向解析
  • 進行基本的網絡診斷
  • 為更復雜的網絡編程打下基礎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81912.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring cloud alibaba-Geteway詳解

spring cloud alibaba-Gateway詳解 Gateway介紹 在 Spring Cloud Alibaba 生態系統中&#xff0c;Gateway 是一個非常重要的組件&#xff0c;用于構建微服務架構中的網關服務。它基于 Spring Cloud Gateway 進行擴展和優化&#xff0c;提供了更強大的功能和更好的性能。 Gat…

iOS 直播技術及優化

iOS直播技術的實現和優化涉及多個技術環節&#xff0c;需結合協議選擇、編解碼方案、播放器技術及性能調優等多方面。 一、核心技術實現 協議選擇與傳輸優化 HLS&#xff08;HTTP Live Streaming&#xff09;&#xff1a;蘋果官方推薦&#xff0c;基于HTTP分片傳輸&#xff0c…

目標檢測135個前沿算法模型匯總(附源碼)!

目標檢測是計算機視覺核心方向之一&#xff0c;也是發論文的熱門領域&#xff01; 近來不僅YOLO算法迎來了新突破&#xff0c;迭代出YOLOv12&#xff01;Mamba、大模型等新技術的發展&#xff0c;也給該領域注入了全新的力量&#xff0c;取得了諸多顯著成果。比如性能飆升82.3…

期刊采編系統安裝升級錯誤

我們以ojs系統為例&#xff1a; PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /esci/data/html/classes/install/Upgrade.inc.php:1019 Stacktrace: #0 /esci/data/html/lib/pkp/classes/install/Installer.inc.php(415): Upgrade->con…

淺談無服務器WebSocket的優勢

實際上&#xff0c;一個實用的解決方案是將構建業務關鍵型實時平臺的復雜性卸載到專門的云服務中。 完全托管的無服務器 WebSocket 解決方案為事件驅動的消息傳遞提供了基礎結構;它使底層基礎設施成為一種商品。客戶端使用提供程序服務發送/接收低延遲消息&#xff0c;并專注于…

Python數據可視化高級實戰之二——熱力圖繪制探究

目錄 一、熱力圖的作用 二、熱力圖反映的信息類型 三、熱力圖的典型應用場景 1. 地球信息系統 (GIS) 2. 城市交通分析 3. 市場分析 4. 用戶行為分析 5. 網絡流量分析 6. 傳染病傳播分析 7. 社交媒體輿情分析 四、Python 繪制熱力圖的關鍵技術要點 1. 數據預處理 2. 顏色選擇與漸…

配電網運行狀態綜合評估方法研究

1評估指標體系的構建 [1]冷華,童瑩,李欣然,等.配電網運行狀態綜合評估方法研究[J].電力系統保護與控制,2017,45(01):53-59. 1.1評估范圍 圖1為配電系統組成示意圖&#xff0c;其中A、B、C分別表示高、中、低壓配電系統。高壓配變(也稱主變)將35kV或110kV的電壓降到10kV&#…

Docker安裝MinIO對象存儲中間件

MinIO 是一個高性能、分布式的對象存儲系統&#xff0c;兼容 Amazon S3 云存儲服務協議&#xff0c;廣泛應用于企業存儲、大數據、機器學習和容器化應用等領域。以下是詳細介紹&#xff1a; 核心特點 兼容 S3 API &#xff1a;全面兼容 Amazon S3 API&#xff0c;這意味著使用…

HTML回顧

html全稱:HyperText Markup Language(超文本標記語言) 注重標簽語義,而不是默認效果 規則 塊級元素包括: marquee、div等 行內元素包括: span、input等 規則1:塊級元素中能寫:行內元素、塊級元素(幾乎什么都能寫) 規則2:行級元素中能寫:行內元素,但不能寫:塊…

JAVA Spring MVC+Mybatis Spring MVC的工作流程*,多表連查

目錄 注解總結 將傳送到客戶端的數據轉成json數據 **描述一下Spring MVC的工作流程** 1。屬性賦值 BeanUtils.copyProperties(addUserDTO,user); 添加依賴&#xff1a; spring web、mybatis framework、mysql driver Controller和ResponseBody優化 直接改成RestControl…

H2數據庫中一條insert語句到生成java對象到數據寫入磁盤的完整步驟

H2 數據庫將 SQL 語句轉換為磁盤存儲的全過程可以分為以下 8 個關鍵步驟&#xff0c;我們以 INSERT INTO users (id, name) VALUES (1, Alice) 為例詳細說明&#xff1a; 1. SQL 解析與語法樹生成 詞法分析&#xff1a;拆分語句為 INSERT、INTO、users 等 Token語法分析&#…

重磅升級!Google Play商店改版上線

5 月 21 日消息&#xff0c;Android Headline 今天&#xff08;5 月 21 日&#xff09;發布博文&#xff0c;報道稱在 2025 年 I/O 開發者大會上&#xff0c;谷歌宣布更新 Google Play 應用商店&#xff0c;在優化用戶體驗的同時&#xff0c;提升開發者收益。 本次更新中&…

Docker面試題(1)

什么是Docker 一個容器化平臺 形式是容器 將你的應用程序及所有依賴項打包在一起 確保應用程序在任何環境中無縫運行 什么是Docker鏡像 Docker鏡像是Docker容器的源代碼 用于創建容器 使用build命令創建鏡像 什么是 Docker容器 包括應用程序及所有的依賴項 作為操作系統的獨立進…

Ulisses Braga-Neto《模式識別和機器學習基礎》

模式識別和機器學習基礎 [專著] Fundamentals of pattern recognition and machine learning / (美)烏利塞斯布拉加&#xff0d;內托(Ulisses Braga-Neto)著 ; 潘巍[等]譯 推薦這本書&#xff0c;作者有自己的見解&#xff0c;而且提供代碼。問題是難度高&#xff0c;對于初學…

RabbitMQ的簡介

三個概念 生產者&#xff1a;生產消息的服務消息代理&#xff1a;消息中間件&#xff0c;如RabbitMQ消費者&#xff1a;獲取使用消息的服務 消息隊列到達消費者的兩種形式 隊列&#xff08;queue&#xff09;:點對點消息通信&#xff08;point-to-point&#xff09; 消息進入隊…

自動切換剪貼板路徑中反斜杠為正斜杠

有時候需要將我們常見的win全路徑中反斜杠為正斜杠&#xff0c;每次用記事本&#xff0c;編輯替換非常麻煩&#xff0c;于是寫了這個工具&#xff0c;能自動修改剪貼板中的數據&#xff0c;只需要運行一下即可。 實現效果&#xff0c;將類似于下面的路徑&#xff1a; C:\User…

【時時三省】Python 語言----文件

目錄 1,文件打開 2, 文件關閉 3, 文件寫入 4, 文件讀出 5, 文件定位 6, 文件重命名 7, 復制文件 山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 1,文件打開 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…

React 個人筆記 Hooks編程

作用 配合函數式編程&#xff0c;保證在不產生類的時候完成一個整體的組件 常用組件 useStateuseContextuseReduceruseEffectuseMemouseCallback 前三個值為自變量 后三者為因變量 前三者相當于其他編程函數的變量聲明&#xff0c;而后三者相當于對變量進行了(if now ! pr…

logits是啥、傅里葉變換

什么是logtis&#xff1f; 在深度學習的上下文中&#xff0c;logits 就是一個向量&#xff0c;下一步通常被投給 softmax/sigmoid 的向量。。 softmax的輸出是分類任務的概率&#xff0c;其輸入是logits層。 logits層通常產生-infinity到 infinity的值&#xff0c;而softmax層…

Adobe Illustrator學習備忘

1.移動畫板&#xff1a;需按住空格鍵加鼠標一塊才能拖動 2.放大縮小畫板&#xff1a;按住Alt鍵加鼠標滾輪 3.撤回&#xff1a;CtrlZ 4.鋼筆練習網站&#xff1a;The Bzier Game