Можете ли вы объяснить функциональность requestRouteToHost() в android?

В моем коде я использую метод 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;
 }

Спасибо

Ответ 1

Метод requestRouteToHost() не изменяет Wi-Fi на 3G или наоборот!

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

public boolean requestRouteToHost (int networkType, int hostAddress) 

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

  • Параметры

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

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

  • Возвращает

    true on success, false on failure

Ответ 2

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

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

Это объяснение дает больше смысла, учитывая требуемое разрешение. Также кажется, что он не будет работать с WiFi. Итак, похоже, что этот метод полезен для следующего: вы хотите убедиться, что соединение, сделанное с конкретным хостом, будет осуществляться через интерфейс SPECIFIC, а этот интерфейс не является WiFi. Это может иметь смысл для долгосрочного, низкого трафика, эффективного подключения к батарее, например, когда вы хотите, чтобы сокет был открыт для сервера и дождался, когда сервер отправит случайное сообщение. Мобильный интерфейс передачи данных будет иметь больше смысла, чем WiFi, поскольку вам не нужно постоянно поддерживать активную радиостанцию ​​WiFi, и радиостанция мобильной сети всегда будет в любом случае. Кстати, это ТОЧНО, как работает механизм "push" iPhone-сервера: он держит сокет на сервере Apple, постоянно подключенном через интерфейс мобильных данных, ожидая, когда сервер что-то скажет.

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

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