สิ่งนี้ดีหรือไม่ (จะทำในสิ่งที่ฉันต้องการหรือไม่)
คุณสามารถทำได้ 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()
เพื่อตั้งค่าวิธีการร้องขอ อย่างไรก็ตามคุณต้องคำนึงถึงว่า webapps หรือเซิร์ฟเวอร์ homegrown บางตัวอาจส่งคืนข้อผิดพลาด HTTP 405สำหรับ HEAD (เช่นไม่พร้อมใช้งานไม่ได้ใช้ไม่ได้รับอนุญาต) ในขณะที่ GET ทำงานได้อย่างสมบูรณ์แบบ การใช้ GET มีความน่าเชื่อถือมากกว่าในกรณีที่คุณต้องการตรวจสอบลิงก์ / ทรัพยากรที่ไม่ใช่โดเมน / โฮสต์
การทดสอบเซิร์ฟเวอร์สำหรับความพร้อมใช้งานไม่เพียงพอในกรณีของฉันฉันต้องทดสอบ URL (อาจไม่สามารถปรับใช้ webapp)
แท้จริงแล้วการเชื่อมต่อโฮสต์จะแจ้งให้ทราบหากโฮสต์นั้นมีอยู่เท่านั้นหากเนื้อหานั้นพร้อมใช้งาน มันอาจเกิดขึ้นได้ดีที่เว็บเซิร์ฟเวอร์เริ่มขึ้นโดยไม่มีปัญหา แต่ webapp ล้มเหลวในการปรับใช้ระหว่างการเริ่มต้นของเซิร์ฟเวอร์ อย่างไรก็ตามจะไม่ทำให้เซิร์ฟเวอร์ทั้งหมดล่ม คุณสามารถตรวจสอบได้โดยตรวจสอบว่ารหัสตอบกลับ 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;
}
}