Apakah ini ada gunanya sama sekali (akankah itu melakukan apa yang saya inginkan?)
Anda bisa melakukannya. Cara layak lainnya adalah menggunakan 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.
}
}
Ada juga InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
Namun ini tidak secara eksplisit menguji port 80. Anda berisiko mendapatkan negatif palsu karena Firewall memblokir port lain.
Apakah saya harus menutup koneksi?
Tidak, Anda tidak perlu secara eksplisit. Ini ditangani dan dikumpulkan di bawah tenda.
Saya kira ini adalah permintaan GET. Apakah ada cara untuk mengirim KEPALA sebagai gantinya?
Anda bisa melemparkan yang diperoleh URLConnection
ke HttpURLConnection
dan kemudian gunakan setRequestMethod()
untuk mengatur metode permintaan. Namun, Anda perlu mempertimbangkan bahwa beberapa aplikasi web atau server yang buruk dapat mengembalikan kesalahan HTTP 405 untuk HEAD (yaitu tidak tersedia, tidak diterapkan, tidak diizinkan) sementara GET berfungsi dengan baik. Menggunakan GET lebih dapat diandalkan jika Anda berniat memverifikasi tautan / sumber daya bukan domain / host.
Menguji ketersediaan server tidak cukup dalam kasus saya, saya perlu menguji URL (webapp mungkin tidak digunakan)
Memang, menghubungkan host hanya memberi tahu jika host tersedia, bukan jika konten tersedia. Sebaiknya server web mulai tanpa masalah, tetapi aplikasi web gagal untuk digunakan saat server mulai. Namun ini biasanya tidak menyebabkan seluruh server turun. Anda dapat menentukan itu dengan memeriksa apakah kode respons HTTP adalah 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
Untuk detail lebih lanjut tentang kode status respons, lihat RFC 2616 bagian 10 . Ngomong connect()
-ngomong, panggilan tidak diperlukan jika Anda menentukan data respons. Secara implisit akan terhubung.
Untuk referensi di masa mendatang, berikut adalah contoh lengkap dalam hal metode utilitas, juga memperhitungkan batas waktu:
/**
* 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;
}
}