これは何か良いことですか(私がやりたいことをしますか?)
あなたはそうすることができます。別の実行可能な方法は、を使用することjava.net.Socket
です。
public static boolean pingHost(String host, int port, int timeout) {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(host, port), timeout);
return true;
} catch (IOException e) {
return false; // Either timeout or unreachable or failed DNS lookup.
}
}
もありInetAddress#isReachable()
ます:
boolean reachable = InetAddress.getByName(hostname).isReachable();
ただし、これはポート80を明示的にテストするものではありません。ファイアウォールが他のポートをブロックしているため、誤検知が発生する危険があります。
どういうわけか接続を閉じる必要がありますか?
いいえ、明示的に必要はありません。処理され、内部でプールされます。
これはGETリクエストだと思います。代わりにHEADを送信する方法はありますか?
あなたは得キャストすることができますURLConnection
にHttpURLConnection
を、を使用setRequestMethod()
してリクエストメソッドを設定できます。ただし、GETが完全に正常に機能する一方で、一部の貧弱なWebアプリケーションまたは自社開発サーバーがHEADに対してHTTP 405エラー(つまり、使用不可、実装されていない、許可されていない)を返す可能性があることを考慮する必要があります。ドメイン/ホストではなくリンク/リソースを検証する場合は、GETを使用する方が信頼性が高くなります。
私の場合、サーバーの可用性をテストするだけでは十分ではありません。URLをテストする必要があります(Webアプリケーションがデプロイされていない可能性があります)
実際、ホストを接続すると、ホストが利用可能かどうかが通知されるだけで、コンテンツが利用可能かどうかは通知されません。Webサーバーが問題なく起動したのに、サーバーの起動中にWebアプリケーションが展開に失敗したこともよくあります。ただし、これによってサーバー全体がダウンすることは通常ありません。これは、HTTP応答コードが200かどうかを確認することで判断できます。
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
int responseCode = connection.getResponseCode();
if (responseCode != 200) {
// Not OK.
}
// < 100 is undetermined.
// 1nn is informal (shouldn't happen on a GET/HEAD)
// 2nn is success
// 3nn is redirect
// 4nn is client error
// 5nn is server error
応答ステータスコードの詳細については、 RFC 2616セクション10を。connect()
応答データを決定している場合、呼び出しは必要ありません。暗黙的に接続します。
将来の参考のために、これもユーティリティメソッドのフレーバーの完全な例であり、タイムアウトも考慮に入れています。
/**
* Pings a HTTP URL. This effectively sends a HEAD request and returns <code>true</code> if the response code is in
* the 200-399 range.
* @param url The HTTP URL to be pinged.
* @param timeout The timeout in millis for both the connection timeout and the response read timeout. Note that
* the total timeout is effectively two times the given timeout.
* @return <code>true</code> if the given HTTP URL has returned response code 200-399 on a HEAD request within the
* given timeout, otherwise <code>false</code>.
*/
public static boolean pingURL(String url, int timeout) {
url = url.replaceFirst("^https", "http"); // Otherwise an exception may be thrown on invalid SSL certificates.
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setConnectTimeout(timeout);
connection.setReadTimeout(timeout);
connection.setRequestMethod("HEAD");
int responseCode = connection.getResponseCode();
return (200 <= responseCode && responseCode <= 399);
} catch (IOException exception) {
return false;
}
}