在应用调试过程中,对接的技术人员要求提供一下机顶盒 的外网IP地址,于是打开了盒子上的设置,将IP地址发了过去,对面回复说这是私网IP,要公网IP才可以。

一般情况下,电脑的公网IP地址很好查:打开百度:

但是有些机顶盒上是没有浏览器的,所以就需要通过代码的层面来获取。

通过百度,先找到了如下的方法:

 /*** 获取IP地址* @return* @throws SocketException*/public static String getLocalIPAddress() throws SocketException {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() && (inetAddress instanceof Inet4Address)){return inetAddress.getHostAddress().toString();}}}return "null";}

但是获取到的结果和机顶盒设置里的ip一致的,也就是说还是一个私网IP。

后经过查询,可通过如下方式获取公网IP:

 /*** 获取外网IP地址* @return*/public static String GetNetIp(){String IP = "";try {String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip";URL url = new URL(address);//URLConnection htpurl=url.openConnection();HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setUseCaches(false);connection.setRequestMethod("GET");connection.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.7 Safari/537.36"); //设置浏览器ua 保证不出现503if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream in = connection.getInputStream();// 将流转化为字符串BufferedReader reader = new BufferedReader(new InputStreamReader(in));String tmpString = "";StringBuilder retJSON = new StringBuilder();while ((tmpString = reader.readLine()) != null) {retJSON.append(tmpString + "\n");}JSONObject jsonObject = new JSONObject(retJSON.toString());String code = jsonObject.getString("code");if (code.equals("0")) {JSONObject data = jsonObject.getJSONObject("data");IP = data.getString("ip") + "(" + data.getString("country")+ data.getString("area") + "区"+ data.getString("region") + data.getString("city")+ data.getString("isp") + ")";Log.e("提示", "您的IP地址是:" + IP);} else {IP = "";Log.e("提示", "IP接口异常,无法获取IP地址!");}} else {IP = "";Log.e("提示", "网络连接异常,无法获取IP地址!");}} catch (Exception e) {IP = "";Log.e("提示", "获取IP地址时出现异常,异常信息是:" + e.toString());}return IP;}

在代码中调用:

 try {String localIPAddress = IPutils.getLocalIPAddress();LogUtil.Log_i("IP地址:"+localIPAddress);} catch (SocketException e) {e.printStackTrace();}new Thread(new Runnable() {@Overridepublic void run() {String s = IPutils.GetNetIp();LogUtil.Log_i("外网IP:"+s);}}).start();

获取到的结果:

外网IP:221.220.160.241(中国区北京北京联通)

这说明是成功的。需要注意的是,获取外网IP的方法必须要在子线程中执行。

附完整的工具类:

package com.zyp.river.utils;import android.util.Log;import org.json.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;/*** Created by ZhangYanPeng on 2018/9/19.*/
public class IPutils {/*** 获取IP地址* @return* @throws SocketException*/public static String getLocalIPAddress() throws SocketException {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() && (inetAddress instanceof Inet4Address)){return inetAddress.getHostAddress().toString();}}}return "null";}/*** 获取外网IP地址* @return*/public static String GetNetIp(){String IP = "";try {String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip";URL url = new URL(address);//URLConnection htpurl=url.openConnection();HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setUseCaches(false);connection.setRequestMethod("GET");connection.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.7 Safari/537.36"); //设置浏览器ua 保证不出现503if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream in = connection.getInputStream();// 将流转化为字符串BufferedReader reader = new BufferedReader(new InputStreamReader(in));String tmpString = "";StringBuilder retJSON = new StringBuilder();while ((tmpString = reader.readLine()) != null) {retJSON.append(tmpString + "\n");}JSONObject jsonObject = new JSONObject(retJSON.toString());String code = jsonObject.getString("code");if (code.equals("0")) {JSONObject data = jsonObject.getJSONObject("data");IP = data.getString("ip") + "(" + data.getString("country")+ data.getString("area") + "区"+ data.getString("region") + data.getString("city")+ data.getString("isp") + ")";Log.e("提示", "您的IP地址是:" + IP);} else {IP = "";Log.e("提示", "IP接口异常,无法获取IP地址!");}} else {IP = "";Log.e("提示", "网络连接异常,无法获取IP地址!");}} catch (Exception e) {IP = "";Log.e("提示", "获取IP地址时出现异常,异常信息是:" + e.toString());}return IP;}
}

Android 获取设备公网IP/私网IP地址相关推荐

  1. linux/windows_ip查看(公网ip/私网ip)/通过域名查找ip/解读tracert 的返回结果

    linux/windows_ip查看(公网ip/私网ip)/通过域名查找ip/解读tracert 的返回结果 references [How to Check the IP Address in Li ...

  2. 03. 路由 · 网络 · 公网IP · 私网IP · NAT

    路由 · 网络 · NAT 路由 练习1 - 让4台主机之间可以互相通信 练习2 - 让4台主机之间可以互相通信 数据包的传输过程(简述) 第一个包的丢失 网络.互联网 .因特网 ISP 服务器 网络 ...

  3. 网络基础:数据链路层_公网i私网ip、路由通信、MTU以及ip分片

    在本章节开始前,先提出几个问题: 公网ip和私网ip的区别是什么,哪个能重复哪个不能? 如何实现两个设备之间的信息通信? 是通过公网ip查找还是私网ip查找? 路由表包含的信息有哪些? ARP协议的作 ...

  4. 百度查到的ip和ipconfig查到的不一样,公网ip 私网ip

    公网IP是在公网中使用的IP地址,一个可直接访问其他IP,也可被其他IP直接访问的一个独立身份.有了它,你可以直接找到互联网中的其他电脑,也可以被其他电脑找到私网IP是在局域网中使用的IP地址. 而私 ...

  5. 公网和私网ip地址范围

    公网地址的范围: A类:地址范围1.0.0.0~127.255.255.255,主要分配给主机数量多.局域网数量少的大型网络; B类:地址范围为128.0.0.0至191.255.255.255,一般 ...

  6. android获取设备eth0,eth1,wlan0的IP地址

    在做一些跟网络相关的需求时,很多时候需要获取到相关网络类型的IP地址,如下图: 这个时候用什么方法来获取这个IP地址呢?楼主在之前的开发中,找到了以下方法,代码如下,仅供参考: /*** Get Ip ...

  7. 路由、 网络、互联网、因特网、公网私网IP、NAT技术

    路由 在不同网段之间转发数据,需要有路由器的支持 默认情况下,路由器只知道跟他直连的网段,非直连的网段需要通过静态路由.动态路由告诉它. 静态路由 管理员手动添加路由信息(路由表) 适用于小规模网络 ...

  8. 公网ip与私网ip区别联系

    一般的私网的网段 100.0.0.0 10.0.0.0 172.16.0.0 192.168.0.0 什么是公网ip 有了公网ip,那么在互联网上你的宽带就有一个唯一的ip地址,家庭的宽带的公网ip地 ...

  9. 公网IP和私网IP有什么区别?

    关键词 IP分类 公网IP 私网IP 内网IP 局域网IP public ip address private ip address 什么是公网IP ? 公网IP是全球唯一的,只能分配给一台设备,是用 ...

最新文章

  1. windows reload()
  2. (转)基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出...
  3. 洛谷P1690 贪婪的Copy 题解
  4. 线程池 Future 带返回结果
  5. Pandas循环提速 7 万多倍是怎么实现的?
  6. for循环提高内存访问效率的做法
  7. ofd阅读器qt_GitHub - gogo123150/ofdEditor: 一个很简陋的ofdEditor
  8. 前端开发常见的英语单词汇总
  9. Python实现k均值聚类算法_K-Means聚类算法
  10. 线性表的链式存储结构 ( 链表 )
  11. Linux Kernel Atomic解析
  12. android实现微信付款功能,Android实现微信支付功能详解
  13. [心得]AUP Unix编程艺术知识整理
  14. 2019年DevOps最新现状研究报告解读
  15. 锅炉软化水不合格是怎么回事?该如何解决?
  16. fastjson解析多层对象中的属性
  17. 谷歌排名影响因素最新研究(SEM RUSH版)
  18. MATLAB学习0基础
  19. hdu 多校赛 第二场
  20. 联想禁止 win10 更新 v2.11 免费版

热门文章

  1. protostuff 工具类
  2. npx 有什么作用跟意义?为什么要有 npx?什么场景使用?
  3. [基础]tfcenter开启Webdav文件服务
  4. 零基础的人应该怎么自学java
  5. IDEA整体字体大小修改
  6. Python中f-string用法
  7. 从技术转管理,做了什么来拯救自己?
  8. 前AMD芯片架构师吐槽,取消 K12 处理器项目是因为 AMD 怂了!
  9. 距离-多普勒谱(RD谱)之三:FFT避坑指南
  10. 什么是伪类?什么是伪元素?区别是什么?