Est-ce tout de bon à tous (il va faire ce que je veux?)
Vous pouvez le faire. Un autre moyen est d'utiliser java.net.Socket
.
Socket socket = null;
boolean reachable = false;
try {
socket = new Socket(hostnameOrIP, 80);
reachable = true;
} finally {
if (socket != null) try { socket.close(); } catch(IOException e) {}
}
Il y a aussi le InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
Toutefois, cela n'est pas explicitement tester le port 80. On risque d'obtenir des faux négatifs en raison d'un Pare-feu qui bloque les autres ports.
Dois-je en quelque sorte fermer la connexion?
Non, vous n'avez pas explicitement le besoin. Il est géré et mis en commun sous le capot.
Je suppose que c'est une requête GET. Est-il possible d'envoyer la TÊTE à la place?
Vous pouvez lancer le obtenue URLConnection
de HttpURLConnection
, puis utiliser setRequestMethod()
pour définir la méthode de la requête. Cependant, vous devez prendre en compte que certains pauvres webapps ou endogène serveurs peuvent revenir erreur HTTP 405 pour une TÊTE (c'est à dire pas disponible, pas mis en œuvre, ne sont pas permis) alors qu'un GET fonctionne parfaitement bien. Mais, ce sont là de très rares cas.
Mise à jour selon les commentaires: connexion de l'hôte informe seulement si l'hôte est disponible, pas si le contenu est disponible. Vous semblez plus intéressé par le contenu, car il peut aussi bien arriver que le serveur a démarré sans problèmes, mais la webapp impossible de déployer au cours du serveur de démarrer. Ce sera toutefois généralement pas en cause l'intégralité de l'arrêt du serveur. Si vous souhaitez déterminer le code de réponse HTTP.
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
Pour plus de détails sur le statut de la réponse codes de voir la RFC 2616 section 10. Appelant connect()
n'est d'ailleurs pas nécessaire si vous êtes à la détermination des données de réponse. Il sera implicitement se connecter.
Pour référence, voici un exemple complet dans la saveur d'une méthode utilitaire, en prenant aussi en compte avec des délais d'expiration:
/**
* 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 ping(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;
}
}