2013-06-26 2 views
0

Я пытаюсь проверить, если сервер доступен, но при запуске этого кода я получаю сообщение об ошибке, что сервер недоступен или иногда приложение зависает даже сервер правильно работает:Проверка доступности сервера не работает

InetAddress in; 
    in = null; 

     try { 
      in = InetAddress.getByAddress(new byte[] { (byte)192, (byte)168, (byte)16, (byte)48}); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      if (in.isReachable(5000)) { 
       loadProduct(); 
      } else 
      { 
       showAlertBox("Warning", "Server not available!"); 
      } 
     } catch (IOException e) { 
      showAlertBox("Warning", "Server not available!"); 
     } 

Есть ли лучший способ проверить, находится ли сервер в сети?

+0

я нашел простое решение в http://stackoverflow.com/a/15785326/1866833 Спасибо всем. – Josef

ответ

-1

Вы можете попытаться найти сервер, используя свое имя хоста. Преимущество: в отличие от динамического IP-адреса, имя хоста, вероятно, имеет более длительный срок действия. В следующем примере оба сетевых интерфейса могут ссылаться на один и тот же хост.

byte[] b = { 10, 0, 0, 1 }; 

String name = "Hostname"; 

InetAddress ia = Inet4Address.getByAddress(b); 
InetAddress ia2 = Inet4Address.getByName(name); 

Другое возможное решение: перед использованием сетевых операций на андроида, вы должны получить соответствующие разрешения от андроида манифеста. Я не знаю точно, какие из следующих должны имущими:

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
+1

(1) Здесь нет ничего, что отвечало бы на вопрос. (2) В динамических адресах API нет ничего: на самом деле вопрос показывает * локальный * IP-адрес. (3) Там нет ничего о сбоях разрешения на подключение. -1 – EJP

+0

Это не работает. @EJP прав. – Josef

0

Есть ли лучший способ проверить, если сервер онлайн

Да. Попробуйте подключиться к нему. Это непогрешимый тест. Не делайте этого, пока вам это не понадобится, конечно. Не пытайтесь предсказать будущее. Просто подключитесь и обработайте сбой.

0

Я попытался с этим

 Socket socket = null; 
    boolean reachable = false; 
    try { 
     socket = new Socket("192.168.16.48", 80); 
     reachable = true; 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     showAlertBox("Warning", "Server not available!"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     showAlertBox("Warning", "Server not available!"); 
    } finally {    
     if (socket != null) try { socket.close(); } catch(IOException e) { } 
    } 

Он работает, но иногда я получаю meesage, что это приложений не отвечает, даже если тайм-аут сокета регулируется.

+0

Я не знаю, почему вы попытались с этим, когда у вас было восемь часов, чтобы подумать, что вы не должны пытаться предсказать будущее. Просто попробуйте установить соединение *, когда вам нужно соединение *, и справиться с сбоем * в то время. * Вы все равно должны это сделать: зачем обрабатывать его дважды? – EJP