如何在 Java 中實現自己的 InetAddress.isReachable(String address, int port, int timeout) 方法?
已發表: 2020-10-06
在 Java 中有多種方法可以檢查 ping 和端口檢查。 您可以使用系統默認的 ping 命令、Java 的本地方法InetAddress
實用程序、 HttpURLConnection
等等。
在生產或測試環境中,如果要執行多個端口檢查,比如說同時進行數百次檢查,那麼有時InetAddress.isReachable()
方法沒有得到正確的響應。
在我的情況下感染,我在嘗試連接到 www.google.com 時注意到 100% 失敗。 您有以下任何問題嗎?
- java – 當我可以 ping IP 地址時,為什麼 InetAddress.isReachable 返回 false?
- 如何檢查我是否有互聯網連接?
- java.net.InetAddress.isReachable() 的 Java 代碼示例
- java檢查ip地址是否可達
- 如何測試遠程系統是否可達?
如果您想使用 HttpURLConnection.openConnection() 執行 ping 檢查,請遵循本教程
在本教程中,我們將介紹 2 種不同的方式來執行 Ping 檢查:
- InetAddress.isReachable(timeout) 方法
- Crunchify 的
crunchifyAddressReachable(host, port, timeout)
方法 100% 有效
讓我們開始吧:
- 創建類 CrunchifyInetAddressIsReachable.java。
- 我們將創建 2 個方法 pingCheckbyInetAddressisReachable() 和 pingCheckbyCrunchifyisReachable(),我們將在其中執行上述 2 個不同的測試。
我們使用 crunchifyAddressReachable() 的方法是什麼?
我們在實現中使用java.net.Socket
。 Socket 類實現客戶端套接字。 在connect()
實用程序的幫助下,我們得到了 100% 正確的結果。 請查看以下代碼以獲取更多詳細信息。
CrunchifyInetAddressIsReachable.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
package crunchify . com . tutorial ; import java . io . IOException ; import java . net . InetAddress ; import java . net . InetSocketAddress ; import java . net . Socket ; /** * @author Crunchify.com * Problem: Sometimes InetAddress.isReachable() gives false result. * We have implemented the same Reachable check using Socket. It works almost 100% of the time. * Comparison added. * Version: 1.1 * */ public class CrunchifyInetAddressIsReachable { static String host = "www.google.com" ; public static void main ( String [ ] args ) { // check ping using default Java Utility pingCheckbyInetAddressisReachable ( ) ; // check ping using modified Crunchify Utility pingCheckbyCrunchifyisReachable ( ) ; } private static void pingCheckbyInetAddressisReachable ( ) { try { InetAddress crunchifyAddr = InetAddress . getByName ( host ) ; boolean reachable = crunchifyAddr . isReachable ( 2000 ) ; if ( reachable ) { System . out . println ( "InetAddress.isReachable(timeout) Result ==> Ping successful for host: " + host ) ; } else { System . out . println ( "InetAddress.isReachable(timeout) Result ==> Ping failed for host: " + host ) ; } } catch ( Exception e ) { e . printStackTrace ( ) ; } } private static void pingCheckbyCrunchifyisReachable ( ) { try { crunchifyAddressReachable ( host , 80 , 2000 ) ; System . out . println ( "\nOverloaded isReachable(host, port, timeout) Result ==> Ping successful for host: " + host ) ; } catch ( Exception e ) { System . out . println ( "\nOverloaded isReachable(host, port, timeout) Result ==> Ping failed for host: " + host ) ; } } /* * Overriding default InetAddress.isReachable() method to add 2 more arguments port and timeout value * * Address: www.google.com * port: 80 or 443 * timeout: 2000 (in milliseconds) */ private static boolean crunchifyAddressReachable ( String address , int port , int timeout ) throws IOException { Socket crunchifySocket = new Socket ( ) ; try { // Connects this socket to the server with a specified timeout value. crunchifySocket . connect ( new InetSocketAddress ( address , port ) , timeout ) ; // Return true if connection successful return true ; } catch ( IOException exception ) { exception . printStackTrace ( ) ; // Return false if connection fails return false ; } finally { crunchifySocket . close ( ) ; } } } |
將代碼複製到 Eclipse 環境後,只需作為 Java 應用程序運行即可查看以下結果。

控制台輸出:
1 2 3 |
InetAddress . isReachable ( 2000 ) Result == > Ping failed for host : www . google . com Overloaded isReachable ( host , port , timeout ) Result == > Ping successful for host : www . google . com |