I have a URL in the form
http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s
And want to check if it is available.
The links redirect me on a bad request page if I try to open these with a browser, however via code I can get the data that I need.
Using a try-catch block on a HTTP request procedure is pretty slow, so I'm wondering how I could ping a similar address to check if its server is active.
I have tried
boolean reachable = InetAddress.getByName(myLink).isReachable(6000);
But returns always false
.
I have also tried
public static boolean exists(String URLName) {
try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection();
con.setConnectTimeout(1000);
con.setReadTimeout(1000);
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
That returns the correct value at the end of the process, bit is too slow if server is not available.
EDIT
I have understood what is the cause of slowness
a) if server returns some data but interrupts the request before complete the request the timeout is ignored and stuck until returns an Exception
that lead the execution to reach the catch block, this is the cause of the slowness of this method, and still I haven't found a valid solution to avoid this.
b) If I start the android device and open the App without connection, the false value is returned correctly, if the app is opened with internet connection active and the device lost its internet connection happens the same thing of the case A (also if I try to terminate and restart the App... I don't know why, I suppose that something remains cached)
All this seems related to the fact Java URLConnection
doesn't provide no fail-safe timeout on reads. Looking at the sample at this link I have seen that uses a thread to interrupt the connection in some way but if I add simply the line new Thread(new InterruptThread(Thread.currentThread(), con)).start();
like in the sample nothing changes.
here the writer suggests this:
read the link. its seems very good
EDIT: in my exp of using it, it's not as fast as this method:
they are a bit different but in the functionality for just checking the connection to internet the first method may become slow due to the connection variables.
As mentioned by 'eridal', that should be faster, open the socket; however, it only tells you that a server is listening on the host and port but to be sure, you need to write HTTP or alternately a bad request (junk), you should get HTTP/1.1 400 Bad Request. By reading the first line returned, if it contains HTTP, then you are sure that the server is a HTTP server. This way you are sure that the server is available as well as a HTTP server.
This is in extension to the above answer by eridal.
Below code waits until webpage is available:
I had similar problem last month and someone helped me out with an optional example. I'd like to suggest you the same
if return true than your url server is available else is not available currently.