para - manual de programacion android pdf
Android: ¿Cómo verificar si el servidor está disponible? (7)
Estoy desarrollando una aplicación que se conecta al servidor. Por ahora, el inicio de sesión y la transmisión de datos funcionan bien si el servidor está disponible. El problema surge cuando el servidor no está disponible. En este caso, el método envía una solicitud de inicio de sesión y espera la respuesta.
¿Alguien sabe cómo verificar si el servidor está disponible (visible)?
El pseudocódigo de la lógica simple que debe implementarse es el siguiente:
- String serverAddress = (Leer el valor del archivo de configuración) // ya está hecho
- boolean serverAvailable = (Compruebe si el servidor serverAddress está disponible) // tiene que implementarse
- (Aquí viene la lógica que depende de serverAvailable)
¿Estás trabajando con HTTP? Luego, podría establecer un tiempo de espera en su conexión HTTP, como tal:
private void setupHttpClient() {
BasicHttpParams httpParams = new BasicHttpParams();
ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT);
//...
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
httpParams, schemeRegistry);
this.httpClient = new DefaultHttpClient(cm, httpParams);
}
Si luego ejecuta una solicitud, obtendrá una excepción después del tiempo de espera dado.
Ah, no no, el código en Java no funciona: InetAddress.getByName ("fr.yahoo.com"). IsReachable (200) aunque en el LogCat vi su dirección IP (lo mismo con 20000 ms de tiempo de espera) .
Parece que el uso del comando ''ping'' es conveniente, por ejemplo:
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 ... }
Con una simple prueba de ping, esto funcionó para mí:
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;
}
No olvide ejecutar esta función en un hilo (no en el hilo principal).
Probablemente necesite código Java ya que está trabajando en Android. El equivalente de Java, que creo que funciona en Android, debería ser:
InetAddress.getByName(host).isReachable(timeOut)
puedes usar
InetAddress.getByName(host).isReachable(timeOut)
pero no funciona bien cuando el host no responde en tcp 7. Puede verificar si el host está disponible en ese puerto lo que necesita con ayuda de esta función:
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 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;
}
}
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;
}
pruébalo, trabaja para mí y no olvides activar android.permission.ACCESS_NETWORK_STATE