在我的代码中我使用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;
}
Thanks
我认为这是一种记录极差的方法,虽然上面的评论说“将其视为 ping”可能是一个合理的解释,但我认为这是不正确的。它采用 int 作为主机地址这一事实表明它是一个比这低得多的方法,并且 JavaDoc 中的注释This method requires the caller to hold the permission CHANGE_NETWORK_STATE
这是另一个线索,表明这会改变设备的内部路由表。这个链接提供了更好的解释:
requestRouteToHost() 不会在任何网络上建立连接,它
仅确保指定主机的任何流量都将被路由
通过指定的网络类型(wifi 或移动)。连接性必须
指定网络上已存在。
考虑到所需的许可,这种解释更有意义。它似乎也无法与 WiFi 一起使用。因此,该方法的用途如下:您希望确保与特定主机的连接将通过特定接口进行,并且该接口不是 WiFi。这对于长期、低流量、电池高效的连接可能有意义,例如当您希望保持套接字对服务器打开并等待服务器偶尔发送消息时。移动数据接口比 WiFi 更有意义,因为您不需要始终保持 WiFi 无线电处于活动状态,并且移动网络无线电始终处于开启状态。顺便说一句,这正是 iPhone 的服务器“推送”机制的工作原理:它通过移动数据接口保持与 Apple 服务器的套接字不断连接,等待服务器发出指令。
因此,与(当前选择的)正确答案相反,我建议对提问者的问题的答案:Does this routing means changing the WIFI to 3G or vice versa??
实际上是“是的,有点像!”如果该方法返回 true,则调用者确信将通过指定的接口连接到该 IP 地址。
还有 Google:对你没有更好地记录你的一些 API 表示不满!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)