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

Java 網路程式設計精通指南(12):InetAddress.isReachable() — 主機可達性探測

     編輯:Java 相關知識

J2SE 5.0 引入 InetAddress.isReachable(),提供類似 ping 的主機可達性檢測。本文解析其兩個重載、底層原理、適用場景與局限性。

方法簽名

public boolean isReachable(int timeout) throws IOException
public boolean isReachable(NetworkInterface netif, int ttl, int timeout) throws IOException

參數詳解

  • timeout:最大等待時間(毫秒),超時返回 false。
  • netif:指定發送探測包的網絡介面(多網卡場景指定出口)。
  • ttl:Time-To-Live,最大路由躍點數。超過躍點仍未達目標視為不可達。

底層原理

基於 ICMP Echo Request (ping) 或 TCP Echo 端口 (7) 實現。嘗試建立到目標主機 Echo 服務的連接,成功收到響應返回 true。

適用場景與局限

場景可靠性說明
局域網 (LAN)高無防火牆攔截 ICMP/TCP Echo,準確反映主機在線狀態
互聯網 (Internet)低防火牆、路由器常屏蔽 ICMP/TCP Echo 端口,導致誤判為不可達
跨網段/VPN中取決於中間設備是否允許探測包通過
建議:僅在受控網路環境 (LAN、數據中心內網) 使用。公網可用性檢測請改用業務層心跳 (HTTP HEAD、自定義 TCP 心跳)。

代碼示例

InetAddress target = InetAddress.getByName("192.168.1.100");

// 簡單探測,3 秒超時
boolean reachable = target.isReachable(3000);
System.out.println("Host reachable: " + reachable);

// 進階:指定網卡 eth0 (索引 1),TTL 10 跳,5 秒超時
NetworkInterface eth0 = NetworkInterface.getByName("eth0");
if (eth0 != null) {
    reachable = target.isReachable(eth0, 10, 5000);
    System.out.println("Via eth0, TTL=10: " + reachable);
}

異常處理

  • IOException:底層網路錯誤(如無權限發送原始套接字、網卡不可用)。
  • Windows/Linux 非 root 權限可能無法發送 ICMP,退而使用 TCP Echo,需目標開放 7 端口。

總結

isReachable() 提供了輕量級的主機存活探測,但在公網環境受限於網路策略,不可作為服務可用性的唯一判斷依據。生產系統應結合應用層心跳、健康檢查端點綜合評估。

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