Điều này có tốt chút nào không (nó sẽ làm những gì tôi muốn chứ?)
Bạn có thể làm như vậy. Một cách khả thi khác là sử dụng 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.
}
}
Ngoài ra còn có InetAddress#isReachable()
:
boolean reachable = InetAddress.getByName(hostname).isReachable();
Tuy nhiên, điều này không kiểm tra rõ ràng cổng 80. Bạn có nguy cơ bị phủ định sai do Tường lửa chặn các cổng khác.
Tôi có phải đóng kết nối bằng cách nào đó không?
Không, bạn không cần rõ ràng. Nó được xử lý và gộp dưới mui xe.
Tôi cho rằng đây là một yêu cầu NHẬN. Có cách nào để gửi ĐẦU thay thế?
Bạn có thể truyền thu được URLConnection
đến HttpURLConnection
và sau đó sử dụng setRequestMethod()
để đặt phương thức yêu cầu. Tuy nhiên, bạn cần tính đến việc một số ứng dụng web hoặc máy chủ gia đình kém có thể trả về lỗi HTTP 405 cho một ĐẦU (nghĩa là không khả dụng, không được triển khai, không được phép) trong khi GET hoạt động hoàn toàn tốt. Sử dụng GET đáng tin cậy hơn trong trường hợp bạn có ý định xác minh các liên kết / tài nguyên không phải tên miền / máy chủ lưu trữ.
Kiểm tra tính khả dụng của máy chủ là không đủ trong trường hợp của tôi, tôi cần kiểm tra URL (ứng dụng web có thể không được triển khai)
Thật vậy, kết nối một máy chủ chỉ thông báo nếu máy chủ có sẵn, không phải nếu nội dung có sẵn. Điều tốt có thể xảy ra là một máy chủ web đã khởi động mà không gặp vấn đề gì, nhưng ứng dụng web không thể triển khai trong quá trình khởi động máy chủ. Tuy nhiên, điều này thường sẽ không làm cho toàn bộ máy chủ bị hỏng. Bạn có thể xác định rằng bằng cách kiểm tra xem mã phản hồi HTTP có phải là 200 không.
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
Để biết thêm chi tiết về mã trạng thái phản hồi, xem RFC 2616 phần 10 . Gọi connect()
là bằng cách không cần thiết nếu bạn đang xác định dữ liệu phản hồi. Nó sẽ ngầm kết nối.
Để tham khảo trong tương lai, đây là một ví dụ hoàn chỉnh về hương vị của một phương thức tiện ích, cũng có tính đến thời gian chờ:
/**
* 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;
}
}