当前位置: 代码迷 >> Android >> 这两种方法获取手机现阶段网络的ip有何区别
  详细解决方案

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

热度:79   发布时间:2016-05-01 13:02:02.0
这两种方法获取手机当前网络的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之后,两个方法得到的结果不一样。
  相关解决方案