¿Es esto bueno en absoluto (¿hará lo que quiero?)
Puedes hacerlo Otra forma factible es usar 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.
}
}
También está el InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
Sin embargo, esto no prueba explícitamente el puerto 80. Corre el riesgo de obtener falsos negativos debido a que un cortafuegos bloquea otros puertos.
¿Tengo que cerrar de alguna manera la conexión?
No, no lo necesitas explícitamente. Se maneja y agrupa bajo las capuchas.
Supongo que esta es una solicitud GET. ¿Hay alguna forma de enviar HEAD en su lugar?
Puede emitir el obtenido URLConnection
a HttpURLConnection
y luego usar setRequestMethod()
para establecer el método de la petición. Sin embargo, debe tener en cuenta que algunas aplicaciones web pobres o servidores locales pueden devolver el error HTTP 405 para un HEAD (es decir, no disponible, no implementado, no permitido) mientras que un GET funciona perfectamente bien. El uso de GET es más confiable en caso de que tenga la intención de verificar enlaces / recursos, no dominios / hosts.
Probar la disponibilidad del servidor no es suficiente en mi caso, necesito probar la URL (la aplicación web puede no estar implementada)
De hecho, conectar un host solo informa si el host está disponible, no si el contenido está disponible. Puede suceder que un servidor web haya comenzado sin problemas, pero la aplicación web no se pudo implementar durante el inicio del servidor. Sin embargo, esto generalmente no hará que todo el servidor se caiga. Puede determinar eso comprobando si el código de respuesta HTTP es 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
Para obtener más detalles sobre los códigos de estado de respuesta, consulte RFC 2616 sección 10 . connect()
Por cierto, no es necesario llamar si está determinando los datos de respuesta. Se conectará implícitamente.
Para referencia futura, aquí hay un ejemplo completo del sabor de un método de utilidad, que también tiene en cuenta los tiempos de espera:
/**
* 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;
}
}