2016-02-21 3 views
-2

В моем приложении у меня есть классы AsyncTask, который подключается к локальному/удаленному серверу, чтобы получить некоторые данные, я хочу, чтобы проверить соединение с сервером перед запуском AsyncTask, У меня есть эта функция:Как проверить, существует ли соединение с сервером?

public static boolean checkServerAvailable(String hostURL) { 
    HttpURLConnection connection = null; 
    try { 
     URL u = new URL(hostURL); 
     connection = (HttpURLConnection) u.openConnection(); 
     connection.setConnectTimeout(5000); 
     connection.setRequestMethod("HEAD"); 
     int code = connection.getResponseCode(); 
     System.out.println("" + code); 
     return true; 
     // You can determine on HTTP return code received. 200 is success. 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return false; 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return false; 
    } finally { 
     if (connection != null) { 
      connection.disconnect(); 
     } 
    } 
} 

Эта функция использует таймаут для подключения к серверу, а если истекает время ожидания, это означает, что нет сервера. Проблема в том, что я запускаю этот код, и он возвращает «нет сервера», даже если сервер существует.

Я попытался установить большой тайм-аут, например 5000 мс, но он очень долго останавливает пользовательский интерфейс и иногда все еще возвращает «нет сервера», даже когда сервер существует.

Что мне делать? Спасибо!

+0

Возможно, возникла проблема с подключением к Интернету. – AKSiddique

+0

Какой из этих трех блоков блокировки он вводит, и какое исключение оно выбрасывает? – EJP

+2

'он возвращается ', нет сервера' '. Невозможно. Эта функция возвращает true или false. – greenapps

ответ

-1

попробуйте использовать сокет здесь пример кода

Socket socket; 
    final String host = "your.server.IP.or.host"; 
    final int port = 80; 
    final int timeout = 5000; // 5 seconds or what ever time you want 

    try { 
     socket = new Socket(); 
     socket.connect(new InetSocketAddress(host, port), timeout); 
    } 
    catch (UnknownHostException uhe) { 
     Log.e("ServerSock", "I couldn't resolve the host you've provided!"); 
    } 
    catch (SocketTimeoutException ste) { 
     Log.e("ServerSock", "After a reasonable amount of time, I'm not able to connect, Server is probably down!"); 
    } 
    catch (IOException ioe) { 
     Log.e("ServerSock", "Hmmm... Sudden disconnection, probably you should start again!"); 
    } 
+0

50 секунд - это много времени, я сказал, что он очень долго блокирует пользовательский интерфейс, потому что мне нужно подождать ответа от этой функции, разве у вас нет другой версии? Спасибо! – user5912232

+0

вы можете уменьшить его до 5 секунд до вас, я отредактирую его –

+0

, так что решение должно использовать сокет? как насчет порта, он изменяется между удаленным или локальным сервером? – user5912232

0

проверить соединение с сервером перед AsyncTask работает

Тогда вы должны сделать это в другом AsyncTask.

Так что все это имеет мало смысла.

Вы не используете StrictMode не так ли?

+0

что это такое StrictMode? – user5912232

+0

Пожалуйста, отреагируйте на нужную дополнительную AsyncTask. – greenapps

+0

Вы хотите, чтобы я добавил asyncTask к вопросу? – user5912232

Смежные вопросы