Ho un URL nella formaCome verificare rapidamente se il server URL è disponibile
http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s
e si desidera controllare se è disponibile.
I collegamenti mi reindirizzano su una pagina di richiesta errata se provo ad aprirli con un browser, tuttavia tramite codice posso ottenere i dati di cui ho bisogno.
L'utilizzo di un blocco try-catch su una procedura di richiesta HTTP è piuttosto lento, quindi mi chiedo come posso eseguire il ping di un indirizzo simile per verificare se il server è attivo.
ho cercato
boolean reachable = InetAddress.getByName(myLink).isReachable(6000);
ma ritorna sempre false
.
Ho anche provato
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;
}
}
che restituisce il valore corretto al termine del processo, bit è troppo lento se il server non è disponibile.
EDIT
ho capito qual è la causa della lentezza
a) se il server restituisce alcuni dati, ma interrompe la richiesta prima di completare la richiesta il timeout viene ignorata e bloccato fino al ritorno di un Exception
che portare l'esecuzione per raggiungere il blocco catch, questa è la causa della lentezza di questo metodo, e ancora non ho trovato una soluzione valida per evitare questo.
b) Se avvio il dispositivo Android e apro l'App senza connessione, il valore falso viene restituito correttamente, se l'app viene aperta con connessione Internet attiva e il dispositivo perde la connessione a Internet accade la stessa cosa del caso A (anche se provo a chiudere e riavviare l'app ... non so perché, suppongo che qualcosa rimanga memorizzato nella cache)
Tutto ciò sembra correlato al fatto che lo Java URLConnection
non fornisce un timeout fail-safe su legge. Guardando il campione a this link ho visto che utilizza un thread per interrompere la connessione in qualche modo ma se aggiungo semplicemente la riga new Thread(new InterruptThread(Thread.currentThread(), con)).start();
come nell'esempio non cambia nulla.
prova usando getResponseMessage() o getResponseCode() – KOTIOS
Bad Request significa che il tuo URL non è valido, ma non che il server non è disponibile –
@mtetno Potresti darmi maggiori dettagli un uso ha risposto a qualcosa di simile ma sembra lento come aspettare per eccezione del blocco try try correlato – AndreaF