Czy to w ogóle jest dobre (czy zrobi to, co chcę?)
Możesz to zrobić. Innym możliwym sposobem jest użycie 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.
}
}
Jest też InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
Nie oznacza to jednak jawnego testowania portu 80. Istnieje ryzyko uzyskania fałszywych wyników negatywnych, ponieważ zapora blokuje inne porty.
Czy muszę jakoś zamknąć połączenie?
Nie, nie potrzebujesz tego wyraźnie. Jest obsługiwany i gromadzony pod maskami.
Przypuszczam, że jest to żądanie GET. Czy istnieje sposób, aby zamiast tego wysłać HEAD?
Możesz rzutować otrzymane URLConnection
na, HttpURLConnection
a następnie użyć, setRequestMethod()
aby ustawić metodę żądania. Należy jednak wziąć pod uwagę, że niektóre słabe aplikacje internetowe lub własne serwery mogą zwracać błąd HTTP 405 dla HEAD (tj. Niedostępny, nie zaimplementowany, niedozwolony), podczas gdy GET działa doskonale. Korzystanie z GET jest bardziej niezawodne w przypadku, gdy zamierzasz weryfikować linki / zasoby, a nie domeny / hosty.
Testowanie serwera pod kątem dostępności w moim przypadku nie wystarczy, muszę przetestować adres URL (aplikacja internetowa może nie zostać wdrożona)
Rzeczywiście, podłączenie hosta informuje tylko o tym, czy host jest dostępny, a nie o tym, czy zawartość jest dostępna. Równie dobrze może się zdarzyć, że serwer WWW uruchomił się bez problemów, ale aplikacja internetowa nie została wdrożona podczas uruchamiania serwera. Zwykle jednak nie powoduje to awarii całego serwera. Możesz to ustalić, sprawdzając, czy kod odpowiedzi HTTP to 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
Więcej informacji na temat kodów stanu odpowiedzi można znaleźć w dokumencie RFC 2616, sekcja 10 . Nawiasem connect()
mówiąc, dzwonienie nie jest potrzebne, jeśli określasz dane odpowiedzi. Połączy się niejawnie.
Dla przyszłego odniesienia, oto pełny przykład metody użytkowej, uwzględniający również limity czasu:
/**
* 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;
}
}