当我读取设备的IP地址时,我总是获得本地IP地址。
我使用以下代码段来执行此操作。
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";
}
但是我需要在不使用任何外部主机或网络api的情况下读取外部IP地址,例如http://jsonip.com
答案 0 :(得分:0)
大多数回复都是完全正确的。最好的办法是连接到外部服务,此服务将回复您的公共IP地址。但是,您有理由不想连接到外部服务(1)您根本不想运行自己的服务或支付某些第三方服务费用;(2)您的应用程序应该以“隐身”模式运行不只是偶尔联系互联网上的某些服务。
然而,您可以做的是依靠100%纯Java traceroute实现,例如此处提供的实现:http://people.dsv.su.se/~miko1432/ip/ip1/4.3/doc/_traceroute_8java_source.html
通过连接到traceroute实现,您可以在通往Internet的路径上ping一个主机。基本上这种方式你可以“ping”任意公共IP地址并查看到达目的地的路由。
如果查看跟踪,您将看到专用(非路由)IP地址,例如网络192.168.0.0/16和10.0.0.0/8中的IP地址。您可以放心地假设这些是私有地址,并且路由中的第一个公共IP地址是您的公共IP地址。
这也适用于为客户端设备分配公共IP地址的情况,例如某些移动运营商或学术网络的情况。