首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

这两种方法获取手机现阶段网络的ip有何区别

2012-11-07 
这两种方法获取手机当前网络的ip有何区别?方法1:Java codepublic String getLocalIpAddress() {try {for (

这两种方法获取手机当前网络的ip有何区别?
方法1:

Java code
public String getLocalIpAddress() {      try {          for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {              NetworkInterface intf = en.nextElement();              for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {                  InetAddress inetAddress = enumIpAddr.nextElement();                  if (!inetAddress.isLoopbackAddress()) {                      return inetAddress.getHostAddress().toString();                  }              }          }      } catch (SocketException ex) {          Log.e(LOG_TAG, ex.toString());      }      return null;  } 


方法2:
Java code
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);  WifiInfo wifiInfo = wifiManager.getConnectionInfo();  int ipAddress = wifiInfo.getIpAddress();  

wifi的网络,得到一个int值,要再写个int转换ip的方法,就可以得到ip地址了:
Java code
public static String longToIP(long longIp) {// linux long是低位在前,高位在后StringBuffer sb = new StringBuffer("");// 将高24位置0sb.append(String.valueOf((longIp & 0x000000FF)));sb.append(".");// 将高16位置0,然后右移8位sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));sb.append(".");// 将高8位置0,然后右移16位sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));sb.append(".");// 直接右移24位sb.append(String.valueOf((longIp >>> 24)));return sb.toString();}



我通过textView将这两个方法获取的ip都显示出来,一般情况下在手机运营商网络或者wifi的环境下,这两个个方法获取的ip都相同,问题来了,当手机通过vpn代理联网时,这两种方法获取的ip地址就不同了...纠结中,为何呢?

[解决办法]
方法1通过NetworkInterface得到的IP地址,在打开VPN的情况下,会得到连上VPN之后从VPN服务器获得的地址。此时wifi网络只是跳板,真正连接的是VPN通道。
方法2直接和wifi模组沟通,读取当前的局域网IP,不受VPN影响。
所以打开VPN之后,两个方法得到的结果不一样。

热点排行