如何在IPV4格式得到IP_ADDRESS(How do I get IP_ADDRESS in I

2019-06-25 11:27发布

我试图让一个设备的IP地址,即使用WIFI或3G连接。 我得到的IPv6格式是不可理解的IP地址。 我想在IPv4格式IP address.I做了谷歌,但力发现的任何适当的解决方案。

这里是我使用得到一个设备的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

请帮我..

Answer 1:

试图花样繁多后..我终于可以得到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;
}

如下图所示,如果条件加入

 /**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)


Answer 2:

你不能假设任何设备只有一个网络地址。 你也不能想当然地认为它会有什么IPv4的 - 这可能是仅支持IPv6,那么你的应用程序将需要能够同时处理IPv4和IPv6地址显示。

通常情况下,Android手机有一个会被分配可用的IP地址,至少两个接口,rmnet0为3G的数据,这对于IPv4往往是运营商级NAT的,所以无法接受传入套接字连接,也可以有一个IPv6地址; 和wlan0作为无线网络,这将有任何IPv4和/或IPv6地址,可以用它连接到网络的谈判。

安卓的某些版本会故意丢弃(通常更贵)rmnet0链接时,它非常重视无线网络 - 在试图降低3G数据使用。 此行为是当WiFi先后隶属的东西,是一个强制网络门户,需要手动登录的问题。



Answer 3:

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



文章来源: How do I get IP_ADDRESS in IPV4 format