Je développe une application qui se connecte au serveur. À présent, la connexion et la transmission de données fonctionnent correctement si le serveur est disponible. Le problème survient lorsque le serveur n'est pas disponible. Dans ce cas, la méthode envoie une demande de connexion et attend la réponse.
Quelqu'un sait-il comment vérifier si le serveur est disponible (visible)?
Le pseudocode de la logique simple à mettre en œuvre est le suivant:
Il a probablement besoin de Java code car il travaille sur Android. L'équivalent Java - qui je crois fonctionne sur Android - - devrait être:
InetAddress.getByName(Host).isReachable(timeOut)
Avec un simple test de type ping, cela a fonctionné pour moi:
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;
}
N'oubliez pas d'exécuter cette fonction dans un thread (pas dans le thread principal).
vous pouvez utiliser
InetAddress.getByName(Host).isReachable(timeOut)
mais cela ne fonctionne pas correctement lorsque l'hôte ne répond pas sur TCP 7. Vous pouvez vérifier si l'hôte est disponible sur ce port ce dont vous avez besoin à l'aide de cette fonction:
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;
}
essayez-le, travaillez pour moi et n'oubliez pas Android.permission.ACCESS_NETWORK_STATE activé
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;
}
}
Travaillez-vous avec HTTP? Vous pouvez ensuite définir un délai d'expiration sur votre connexion HTTP, comme suit:
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 vous exécutez ensuite une demande, vous obtiendrez une exception après le délai imparti.
Oh, non non, le code dans Java ne fonctionne pas: InetAddress.getByName ("fr.yahoo.com"). IsReachable (200) bien que dans le LogCat j'ai vu son adresse IP ( idem avec 20000 ms de time out).
Il semble que l'utilisation de la commande "ping" soit pratique, par exemple:
Runtime runtime = Runtime.getRuntime (); Process proc = runtime.exec ("ping fr.yahoo.com -c 1"); // autres serveurs, par exemple proc.waitFor (); int exit = proc.exitValue (); if (exit == 0) {// exit normal /* obtenir le contenu de sortie de l'exécution de la commande ping et l'analyser * pour décider si le serveur est accessible */ } else {// sortie anormale, décidez donc que le serveur n'est pas accessible ... }