Я пытаюсь реализовать ping, используя HttpGet, но поведение случайное.
У меня есть следующий код, который проверяет подключение к Интернету/серверу:
boolean result = false;
HttpGet request = new HttpGet("www.MyServer.com");
HttpParams httpParameters = new BasicHttpParams();
HttpClient httpClient = new DefaultHttpClient(httpParameters);
try
{
HttpConnectionParams.setConnectionTimeout(httpParameters, 6000);
HttpConnectionParams.setSoTimeout(httpParameters, 6000);
HttpResponse response = httpClient.execute(request);
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK)
{
result = true;
}
}
catch(Exception e)
{
e.printStackTrace();
result = false;
}
Log.d("App", "Ping Result:"+result);
Над кодом я бегу в потоке, так как это может занять время. Когда я впервые запускаю этот тест, я получаю результат как истинный, но после того, как поведение случайное, несколько раз оно давало мне ошибку "host unreachable", и я получаю результат как false.
Я просто хочу проверить, доступен ли сервер из настроенной в настоящее время сети Android.
Есть ли какой-либо надежный API для тестирования подключения к Интернету/серверу?
ОБНОВИТЬ:
В службе у меня есть следующая функция, которая инициирует тест.
void startTest()
{
ServerTestThread mServerTestThread = new ServerTestThread()
mServerTestThread.start();
}
class ServerTestThread extends Thread
{
boolean result = false;
public void run()
{
//HttpGet code
//Send Message TO GUI Thread with result.
}
}
Над функцией startTest
экземпляр тестового потока и функция запуска вызова. когда тест сделан, я отправляю сообщение в основной поток, содержащий результат.
Благодарю.
У вас нет проблем с вашим кодом. Это означает:
1) Иногда сервер действительно недоступен
2) Соединение медленное и время выхода до достижения сервера.
Поэтому установите тайм-аут настройки на некоторое большее значение, например 60000 (60 секунд), и снова проверьте. Если это работает, то вы знаете, что это было из-за таймаута.
РЕДАКТИРОВАТЬ
Также, пожалуйста, внесите это изменение, возможно, это даст нам дополнительную информацию:
Log.d("App", "Status:" + status);
if (status == HttpStatus.SC_OK)
{
result = true;
}
EDIT2
class ServerTestThread extends Thread
{
public static boolean result = false;
public static HttpGet request = new HttpGet("www.MyServer.com");
public static HttpParams httpParameters = new BasicHttpParams();
public static HttpClient httpClient = new DefaultHttpClient(httpParameters);
boolean result = false;
public void run()
{
//HttpGet code
//Send Message TO GUI Thread with result.
}
}
EDIT3
это скажет, если вы подключены к сети:
boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
//we are connected to a network
connected = true;
}
Предупреждение. Если вы подключены к сети Wi-Fi, которая не включает доступ в Интернет или требует аутентификации на основе браузера, connected
будет по-прежнему истинным.
вам понадобится это разрешение в вашем манифесте: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>