क्या यह बिल्कुल अच्छा है (क्या यह वही होगा जो मैं चाहता हूं?)
आप ऐसा कर सकते हैं। एक और संभव तरीका उपयोग कर रहा है 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.
}
}
वहाँ भी है InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
हालांकि यह स्पष्ट रूप से पोर्ट 80 का परीक्षण नहीं करता है। फ़ायरवॉल के कारण अन्य पोर्ट को अवरुद्ध करने के कारण आपको गलत नकारात्मक का खतरा होता है।
क्या मुझे किसी तरह कनेक्शन बंद करना है?
नहीं, आपको स्पष्ट रूप से आवश्यकता नहीं है। यह संभाला और हुड के नीचे जमा है।
मुझे लगता है कि यह एक GET अनुरोध है। क्या इसके बजाय HEAD भेजने का कोई तरीका है?
आप प्राप्त डाल सकता URLConnection
करने के लिए HttpURLConnection
और उसके बाद का उपयोग setRequestMethod()
अनुरोध विधि सेट करने के लिए। हालाँकि, आपको इस बात का ध्यान रखना होगा कि कुछ खराब वेबएप या होमग्राउन सर्वर HTTP 405 एरर को HEAD (यानी उपलब्ध नहीं, लागू नहीं, लागू नहीं) के लिए लौटा सकते हैं जबकि GET पूरी तरह से ठीक काम करता है। यदि आप लिंक / संसाधनों को सत्यापित करने का इरादा नहीं रखते हैं तो GET का उपयोग करना अधिक विश्वसनीय है।
उपलब्धता के लिए सर्वर का परीक्षण करना मेरे मामले में पर्याप्त नहीं है, मुझे URL का परीक्षण करने की आवश्यकता है (वेबएप की तैनाती नहीं की जा सकती)
दरअसल, किसी होस्ट को कनेक्ट करना केवल तभी सूचित करता है जब होस्ट उपलब्ध हो, न कि कंटेंट उपलब्ध हो। यह अच्छा हो सकता है कि एक वेबसर्वर बिना किसी समस्या के शुरू हो गया है, लेकिन सर्वर की शुरुआत के दौरान वेबैप तैनात करने में विफल रहा। हालांकि यह आमतौर पर पूरे सर्वर को कम करने का कारण नहीं होगा। आप यह निर्धारित कर सकते हैं कि HTTP प्रतिसाद कोड 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
प्रतिक्रिया स्थिति कोड के बारे में अधिक विस्तार के लिए RFC 2616 अनुभाग 10 देखें । connect()
यदि आप प्रतिक्रिया डेटा का निर्धारण कर रहे हैं तो कॉलिंग की आवश्यकता नहीं है। यह अंतर्निहित रूप से जुड़ेगा।
भविष्य के संदर्भ के लिए, यहाँ एक उपयोगिता विधि के स्वाद में एक पूर्ण उदाहरण है, समयबाह्य के साथ खाता भी:
/**
* 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;
}
}