Можете ли вы объяснить функциональность requestRouteToHost () в Android? - PullRequest
3 голосов
/ 03 августа 2011

В моем коде я использую requestRouteToHost() метод:

Означает ли эта маршрутизация изменение WIFI на 3G или наоборот ??

Мой код не работает ...

public static boolean isHostAvailable(Context context, String urlString) throws UnknownHostException, MalformedURLException { 
     boolean ret = false; 
     int networkType = ConnectivityManager.TYPE_WIFI; 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(cm != null){ 
             NetworkInfo nf = cm.getActiveNetworkInfo(); 
             if(nf != null){ 
                     networkType = nf.getType(); 
             } 
             URL url = new URL(urlString); 
             InetAddress  iAddress = InetAddress.getByName(url.getHost()); 
             ret = cm.requestRouteToHost(networkType, ipToInt(iAddress.getHostAddress())); 
     } 
     return ret; 
}

public static int ipToInt(String addr) {
     String[] addrArray = addr.split("\\.");

     int num = 0;
     for (int i=0;i<addrArray.length;i++) {
         int power = 3-i;

         num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power)));
     }
     return num;
 }

Спасибо

Ответы [ 2 ]

28 голосов
/ 27 июля 2012

Я думаю, что это крайне плохо документированный метод, и хотя вышеприведенный комментарий, говорящий «считай, что это пинг», может быть разумной интерпретацией, я не думаю, что это правильно.Тот факт, что он принимает int в качестве адреса хоста, говорит о том, что это гораздо более низкоуровневый метод, чем тот, и комментарий в JavaDoc This method requires the caller to hold the permission CHANGE_NETWORK_STATE является еще одной подсказкой, предполагая, что это вносит изменения во внутреннюю таблицу маршрутизации устройства., Эта ссылка дает лучшее объяснение:

requestRouteToHost () не устанавливает соединение в какой-либо сети, оно только гарантирует, что любой трафик для указанного хоста будет маршрутизироваться через указанныйТип сети (Wi-Fi или мобильный).Соединение должно уже существовать в указанной сети.

Это объяснение делает НАМНОГО более целесообразным, учитывая необходимое разрешение.Также кажется, что он не будет работать с WiFi.Таким образом, кажется, что этот метод полезен для следующего: Вы хотите убедиться, что соединение с конкретным хостом будет установлено через УКАЗАТЕЛЬНЫЙ интерфейс, и этот интерфейс не является WiFi.Это может иметь смысл для долгосрочного соединения с низким потреблением трафика и низким энергопотреблением, например, когда вы хотите оставить сокет открытым для сервера и подождать, пока сервер отправит случайное сообщение.Интерфейс мобильной передачи данных имеет больше смысла, чем Wi-Fi, так как вам не нужно постоянно поддерживать Wi-Fi-радио, а мобильная сеть всегда включена.Кстати, именно так работает механизм «проталкивания» сервера iPhone: он поддерживает постоянное подключение сокета к серверу Apple через мобильный интерфейс передачи данных, ожидая, пока сервер что-то скажет.

Итак, в отличие от(выбранный в настоящее время) правильный ответ, я предлагаю ответить на вопрос задающего: Does this routing means changing the WIFI to 3G or vice versa?? на самом деле "Да, вроде как!"Если метод возвращает значение true, вызывающий абонент уверен, что соединения с этим IP-адресом будут происходить через указанный интерфейс.

И Google: Boo для вас, чтобы не документировать некоторые из ваших API лучше!

0 голосов
/ 03 августа 2011

Метод requestRouteToHost() не меняет WiFi на 3G или наоборот!

Официальная документация :

public boolean requestRouteToHost (int networkType, int hostAddress) 

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

  • Параметры

    networkType тип сети, по которой передается трафикк указанному хосту должен быть маршрутизирован

    hostAddress IP-адрес хоста, к которому требуется маршрут

  • Возвращает

    true on success, false on failure

...