【问题标题】:How do I get IP_ADDRESS in IPV4 format如何获取 IPV4 格式的 IP 地址
【发布时间】:2012-06-16 11:19:19
【问题描述】:

我正在尝试获取设备的 IP 地址,即使用 WIFI 或 3G 连接。我得到了无法理解的 IPV6 格式的 IP 地址。我想要 IPV4 格式的 IP 地址。我已经用谷歌搜索过,但没有找到任何合适的解决方案。

这是我用来获取设备 IP 地址的代码

public String getLocalIpAddress() {
    try {
        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();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());
                if (!inetAddress.isLoopbackAddress()) {


                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    return inetAddress.getHostAddress().toString();

                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

我得到了这个输出:

ip1--:/fe80::5054:ff:fe12:3456%eth0%2
ip2--:fe80::5054:ff:fe12:3456%eth0

应该是这样显示的:

192.168.1.1

请帮帮我..

【问题讨论】:

    标签: android ip-address android-4.0-ice-cream-sandwich android-networking


    【解决方案1】:

    在用于 IPv4 地址的 Java API 中似乎有一个单独的类 Inet4Address

    【讨论】:

    • 我试过了,但它给出的是模拟器的默认 IP 地址而不是 localhost 的 IP 地址..
    • Localhost 是 127.0.0.1,我怀疑这就是你想要的。
    • @Tech.Rahul 如果你想获得本地主机,你能不能使用InetAddress addr = InetAddress.getLocalHost();之类的东西?
    • 你在模拟器上吗?如果您这样做可能会遇到一些困难,因为模拟器模拟的是移动连接而不是 wifi,而且它的网络连接是通过主机 PC 转发的。
    • @ChrisStratton 我正在尝试进入模拟器.. 有没有可能做对.. ??
    【解决方案2】:

    尝试了很多技巧..终于我可以得到IPV4格式的IP地址..这是我的代码..

    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();
                    System.out.println("ip1--:" + inetAddress);
                    System.out.println("ip2--:" + inetAddress.getHostAddress());
    
          // for getting IPV4 format
          if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())) {
    
                        String ip = inetAddress.getHostAddress().toString();
                        System.out.println("ip---::" + ip);
                        EditText tv = (EditText) findViewById(R.id.ipadd);
                        tv.setText(ip);
                        // return inetAddress.getHostAddress().toString();
                        return ip;
                    }
                }
            }
        } catch (Exception ex) {
            Log.e("IP Address", ex.toString());
        }
        return null;
    }
    

    添加if条件如下图

     /**This shows IPV4 format IP address*/
     if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())){}
    

    而不是这个

     /**This shows IPV6 format IP address*/
     if (!inetAddress.isLoopbackAddress()){}
    

    非常感谢.. 拉胡尔

    检查地址是否为版本 4 地址的另一种方法是:

    if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)
    

    【讨论】:

    【解决方案3】:

    您不能假设任何设备都只有一个网络地址。您也不能假设它会有任何 IPv4 - 它可能只有 IPv6,因此您的应用程序需要能够处理 IPv4 和 IPv6 地址显示。

    通常情况下,Android 手机至少有两个接口可以分配可用的 IP 地址,rmnet0 用于 3G 数据,对于 IPv4,它通常是运营商级 NAT,因此不能接受传入的套接字连接,并且还可能有一个 IPv6 地址;和 wlan0 用​​于 wifi,它将具有可以与其连接的网络协商的任何 IPv4 和/或 IPv6 地址。

    某些版本的 Android 在连接到 wifi 时会故意丢弃(通常更昂贵的)rmnet0 链接 - 以试图减少 3G 数据使用量。当 wifi 连接到需要手动登录的强制门户时,此行为会出现问题。

    【讨论】:

      【解决方案4】:

      以下是检查是 IPv4 还是 IPv6 的简单方法:

      InetAddress address = InetAddress.getByName(ip);
      if (address instanceof Inet6Address) {
          // It's ipv6
      } else if (address instanceof Inet4Address) {
          // It's ipv4
      }
      

      【讨论】:

        最近更新 更多