在我的代码中,我使用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;
}
由于
答案 0 :(得分:28)
我认为这是一个记录极差的方法,虽然上面的评论说“认为它是一个ping”可能是一个合理的解释,但我不认为这是正确的。它将int作为主机地址的事实表明它是一个比它更低级别的方法,而JavaDoc This method requires the caller to hold the permission CHANGE_NETWORK_STATE
中的注释是另一条线索,这表明这会改变内部路由表装置。 This link提供了更好的解释:
requestRouteToHost()不会在任何网络上建立连接 仅确保将路由指定主机的任何流量 通过指定的网络类型(wifi或移动)。连通性必须 已经存在于指定的网络上。
考虑到所需的许可,这种解释更有意义。它似乎也不适用于WiFi。因此,此方法似乎有用的是:您希望确保通过SPECIFIC接口建立与特定主机的连接,并且该接口不是WiFi。这对于长期,低流量,电池效率高的连接可能是有意义的,例如当您希望将套接字保持对服务器开放并等待服务器发送偶尔的消息时。移动数据接口比WiFi更有意义,因为您不需要一直保持WiFi无线电活动,并且移动网络无线电始终处于打开状态。顺便提一下,这完全是iPhone的服务器“推送”机制的工作方式:它为通过移动数据接口持续连接的Apple服务器保留一个插槽,等待服务器说些什么。
因此,与(当前选择的)正确答案相反,我建议答案提问者Does this routing means changing the WIFI to 3G or vice versa??
实际上是,“是的,有点!”如果该方法返回true,则确保调用者将通过指示的接口与该IP地址建立连接。
对谷歌:嘘你没有更好地记录你的一些API!
答案 1 :(得分:0)
方法requestRouteToHost()
不会将wifi更改为3G,反之亦然!
public boolean requestRouteToHost (int networkType, int hostAddress)
确保存在网络路由,以通过指定的网络接口将流量传送到指定的主机。添加已存在的路由的尝试将被忽略,但会被视为成功。
参数
networkType
要路由指定主机的流量的网络类型
hostAddress
所需路由的主机的IP地址
返回
true on success
,false on failure