java - 如何在不使用外部主机的情况下以编程方式查找设备的外部 IP 地址?

标签 java android android-networking traceroute nat-traversal

当我读取设备的 IP 地址时,我总是得到本地 IP 地址。

我使用以下代码 fragment 来做到这一点。

public String getIpAddress() {
   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()) {
                        String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                        Log.d("VPNConnected",ip);
                        return ip;
                    }
                }
            }

        } catch (Exception ex) {
            Log.d("exception", ex.toString());
        }
        return "EMPTY";
    }

但我需要读取外部 IP 地址而不使用任何外部主机或 Web API,例如 http://jsonip.com

最佳答案

大多数回复都是完全正确的。最好的办法是让你连接到一个外部服务,这个服务用你的公共(public) IP 地址回复。但是,您不想连接到外部服务是有原因的(1)您只是不想运行自己的服务或不想为某些第三方服务付费,以及(2)您的应用程序应该以“隐身”模式运行,并且而不是时不时地联系互联网上的一些服务。

然而,您可以做的是依赖 100% 纯 Java traceroute 实现,例如此处介绍的实现:http://people.dsv.su.se/~miko1432/ip/ip1/4.3/doc/_traceroute_8java_source.html

通过连接到 traceroute 实现,您可以在您的互联网路径上一个接一个地 ping 一个主机。基本上,通过这种方式,您可以“ping”任意公共(public) IP 地址并查看到达目的地的路由。

如果查看跟踪,您会看到私有(private)(非路由)IP 地址,例如网络 192.168.0.0/16 和 10.0.0.0/8 中的 IP 地址。您可以放心地假设这些是私有(private)地址,而您路由上的第一个公共(public) IP 地址就是您的公共(public) IP 地址。

这也适用于为客户端设备分配公共(public) IP 地址的情况,例如某些移动运营商或学术网络的情况。

关于java - 如何在不使用外部主机的情况下以编程方式查找设备的外部 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24803930/

相关文章:

java - IntelliJ 社区找不到生成 WAR 的 Web 应用程序工件

android - 如何从 DatePickerDialog 检索数据到 AlertDialog

java - InputStream 哪个更快 read() 或 read(byte,offset,length)

android - 如何在应用程序打开时获取服务器更新?

java - 在数据库中搜索记录 "Java.lang.NullPointerExepton"

java - 如何将断言添加到 if ..else 条件

java - 使用 getLaunchIntentForPackage 时出现 NullPointerException

java - 如何修复 'android.os.NetworkOnMainThreadException' ?

android - 如何将图片上传到服务器

java - 如何处理GXT 2.2网格中单元格的点击?