Bu hiç iyi mi (istediğimi yapacak mı?)
Bunu yapabilirsiniz. Başka bir uygun yol da kullanmaktır 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.
}
}
Ayrıca InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
Ancak bu bağlantı noktası 80'i açıkça test etmez. Güvenlik Duvarı'nın diğer bağlantı noktalarını engellediği için yanlış negatif alma riskiniz vardır.
Bağlantıyı bir şekilde kapatmak zorunda mıyım?
Hayır, açıkça ihtiyacınız yok. Davlumbazların altında tutulur ve havuzlanır.
Sanırım bu bir GET isteğidir. Bunun yerine HEAD göndermenin bir yolu var mı?
Sen elde yayınlayabileceğim URLConnection
için HttpURLConnection
ve daha sonra kullanmak setRequestMethod()
istek yöntemini ayarlayın. Bununla birlikte, bazı zayıf webapps'ların veya ev sahibi sunucuların bir HEAD için HTTP 405 hatası döndürebileceğini (yani mevcut değil, uygulanmadı, izin verilmez) göz önünde bulundurmanız gerekir . Etki alanlarını / ana bilgisayarları değil bağlantıları / kaynakları doğrulamak istediğinizde GET kullanmak daha güvenilirdir.
Sunucumu kullanılabilirlik açısından test etmek benim durumumda yeterli değil, URL'yi test etmem gerekiyor (web uygulaması dağıtılamayabilir)
Gerçekten de, bir ana makineye bağlanmak, içeriğin kullanılabilir olup olmadığını değil, yalnızca ana makinenin kullanılabilir olup olmadığını bildirir. Bir web sunucusunun sorunsuz başlamış olması da mümkündür, ancak webapp sunucunun başlaması sırasında konuşlandırılamadı. Ancak bu genellikle tüm sunucunun çökmesine neden olmaz. HTTP yanıt kodunun 200 olup olmadığını kontrol ederek bunu belirleyebilirsiniz.
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
Yanıt durum kodları hakkında daha fazla bilgi için bkz. RFC 2616 bölüm 10 . connect()
Yanıt verilerini belirlerseniz, arama yapılması gerekmez. Örtük olarak bağlanacaktır.
Gelecekte başvurmak için, zaman aşımlarını da dikkate alarak bir yardımcı program yönteminin lezzetinde tam bir örnek:
/**
* 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;
}
}