ホームページ >Java >&#&チュートリアル >ホストが ping 可能な場合でも、`InetAddress.isReachable()` が False を返す場合があるのはなぜですか?
InetAddress.isReachable() からの誤った到達可能性の調査
IP アドレスを操作するための Java クラスである InetAddress は、さまざまなネットワーク用のメソッドを提供します。関連するタスク。そのようなメソッドの 1 つは isReachable() で、ホストがネットワーク経由でアクセス可能かどうかを判断するために使用されます。ただし、場合によっては、IP アドレスへの ping が成功した場合でも、このメソッドは false を返すことがあります。
ホストの到達可能性を確認する次のコード スニペットを考えてみましょう。
InetAddress byName = InetAddress.getByName("173.39.161.140"); System.out.println(byName); System.out.println(byName.isReachable(1000));
Ifこのコードを実行すると、指定された IP アドレスに ping できるにもかかわらず、isReachable() が false を返す状況が発生する可能性があります。
この問題に対処するには、プラットフォームに依存せず、リモート マシン上の開いているポートに関する情報を活用する代替アプローチが提示されます。
private static boolean isReachable(String addr, int openPort, int timeOutMillis) { // Any Open port on other machine // openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc. try (Socket soc = new Socket()) { soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); return true; } catch (IOException ex) { return false; } }
このコードを利用すると、次の試行を行うことでホストの到達可能性を判断できます。そのホスト上の既知の開いているポートへの接続を確立します。
更新:
詳細コード スニペットの簡潔なバージョンについては、以下を参照してください。
private static boolean isReachable(String addr, int openPort, int timeOutMillis) { try (Socket soc = new Socket()) { soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); return true; } catch (IOException ex) { return false; } }
このアプローチを採用すると、InetAddress.isReachable() が正確な情報を提供しないシナリオでも、ホストの到達可能性を確実に判断できます。表示。
以上がホストが ping 可能な場合でも、`InetAddress.isReachable()` が False を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。