Android: jak sprawdzić, czy serwer jest dostępny?
Rozwijam aplikację, która łączy się z serwerem. Do tej pory logowanie i transmisja danych działa dobrze, jeśli serwer jest dostępny. Problem pojawia się, gdy serwer jest niedostępny. W tym przypadku metoda wysyła żądanie logowania i czeka na odpowiedź.
Czy ktoś wie jak sprawdzić czy serwer jest dostępny (widoczny)?
Pseudokod prostej logiki, który musi być zaimplementowany jest następujący:
- String serverAddress = (odczyt wartości z plik konfiguracyjny) / / już zrobione
- boolean serverAvailable = (sprawdź, czy serwer serveradress jest dostępny) / / musi zostać zaimplementowany
- (tutaj pojawia się logika, która zależy od serwera)
7 answers
Prawdopodobnie potrzebuje kodu Javy, ponieważ pracuje na Androidzie. Odpowiednikiem Javy, który moim zdaniem działa na Androidzie, powinno być:
InetAddress.getByName(host).isReachable(timeOut)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 09:04:46
Z prostym testem przypominającym ping, zadziałało mi to:
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;
}
Nie zapomnij uruchomić tej funkcji w wątku (nie w głównym wątku).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 21:38:52
Możesz użyć
InetAddress.getByName(host).isReachable(timeOut)
Ale nie działa dobrze, gdy host nie odpowiada na tcp 7. Możesz sprawdzić, czy host jest dostępny na tym porcie, czego potrzebujesz za pomocą tej funkcji:
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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 08:34:29
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;
}
Spróbuj, pracuj dla mnie i nie zapomnij aktywowanego Androida.pozwolenie.ACCESS_NETWORK_STATE
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 19:27:17
Czy pracujesz z HTTP? Można wtedy ustawić limit czasu połączenia HTTP, jako taki:
private void setupHttpClient() {
BasicHttpParams httpParams = new BasicHttpParams();
ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT);
//...
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
httpParams, schemeRegistry);
this.httpClient = new DefaultHttpClient(cm, httpParams);
}
Jeśli wykonasz żądanie, otrzymasz wyjątek po określonym czasie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 11:36:31
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;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-28 19:50:11
Oh, Nie Nie, kod w Javie nie działa: InetAddress. getByName ("fr.yahoo.com"). isReachable (200) chociaż w LogCat widziałem jego adres IP(taki sam z 20000 ms czasu out).
Wydaje się, że użycie polecenia' ping ' jest wygodne, na przykład:
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 ... }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 11:37:08