Можете ли вы объяснить функциональность 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 лучше!