Domanda

Sto sviluppando un'applicazione che si collega al server. Ormai il login e la trasmissione dei dati funzionano bene se il server è disponibile. Il problema sorge quando il server non è disponibile. In questo caso il metodo invia una richiesta di accesso e attende la risposta.

Qualcuno sa come verificare se il server è disponibile (visibile)?

Lo pseudocodice della logica semplice che deve essere implementata è il seguente:

  1. String serverAddress = (Leggi valore dal file di configurazione) // già fatto
  2. boolean serverAvailable = (Controlla se l'indirizzo server server è disponibile) // deve essere implementato
  3. (Ecco la logica che dipende da ServerAvailable)
È stato utile?

Soluzione

Probabilmente ha bisogno del codice Java poiché sta lavorando su Android. L'equivalente Java - che credo funzioni su Android - dovrebbe essere:

InetAddress.getByName(host).isReachable(timeOut)

Altri suggerimenti

Con un semplice test simile a un ping, questo ha funzionato per me:

static public boolean isURLReachable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://192.168.1.13");   // Change to "http://google.com" for www  test.
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(10 * 1000);          // 10 s.
            urlc.connect();
            if (urlc.getResponseCode() == 200) {        // 200 = "OK" code (http connection is fine).
                Log.wtf("Connection", "Success !");
                return true;
            } else {
                return false;
            }
        } catch (MalformedURLException e1) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }
    return false;
}

Non dimenticare di eseguire questa funzione in un thread (non nel thread principale).

puoi usare

InetAddress.getByName(host).isReachable(timeOut)

ma non funziona bene quando l'host non risponde su tcp 7. Puoi verificare se l'host è disponibile su quella porta di cosa hai bisogno con l'aiuto di questa funzione:

public static boolean isHostReachable(String serverAddress, int serverTCPport, int timeoutMS){
    boolean connected = false;
    Socket socket;
    try {
        socket = new Socket();
        SocketAddress socketAddress = new InetSocketAddress(serverAddress, serverTCPport);
        socket.connect(socketAddress, timeoutMS);
        if (socket.isConnected()) {
            connected = true;
            socket.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        socket = null;
    }
    return connected;
}
public static boolean IsReachable(Context context) {
    // First, check we have any sort of connectivity
    final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo netInfo = connMgr.getActiveNetworkInfo();
    boolean isReachable = false;

    if (netInfo != null && netInfo.isConnected()) {
        // Some sort of connection is open, check if server is reachable
        try {
            URL url = new URL("http://www.google.com");
            //URL url = new URL("http://10.0.2.2");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setRequestProperty("User-Agent", "Android Application");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(10 * 1000);
            urlc.connect();
            isReachable = (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            //Log.e(TAG, e.getMessage());
        }
    }

    return isReachable;
}

provalo, lavora per me e non dimenticare android.permission.ACCESS_NETWORK_STATE attivato

Stai lavorando con HTTP? È quindi possibile impostare un timeout sulla connessione HTTP, come tale:

private void setupHttpClient() {
    BasicHttpParams httpParams = new BasicHttpParams();

    ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT);
    //...

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
            httpParams, schemeRegistry);
    this.httpClient = new DefaultHttpClient(cm, httpParams);
}

Se si esegue quindi una richiesta, si otterrà un'eccezione dopo il timeout specificato.

public boolean isConnectedToServer(String url, int timeout) {
try{
    URL myUrl = new URL(url);
    URLConnection connection = myUrl.openConnection();
    connection.setConnectTimeout(timeout);
    connection.connect();
    return true;
} catch (Exception e) {
    // Handle your exceptions
    return false;
 }
}

Oh, no no, il codice in Java non funziona: InetAddress.getByName (" fr.yahoo.com "). isReachable (200) anche se in LogCat ho visto il suo indirizzo IP (lo stesso con 20000 ms di time out).

Sembra che l'uso del comando 'ping' sia conveniente, ad esempio:

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("ping fr.yahoo.com -c 1"); // other servers, for example
proc.waitFor();
int exit = proc.exitValue();
if (exit == 0) { // normal exit
    /* get output content of executing the ping command and parse it
     * to decide if the server is reachable
     */
} else { // abnormal exit, so decide that the server is not reachable
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top