Android 获取设备公网IP/私网IP地址
在应用调试过程中,对接的技术人员要求提供一下机顶盒 的外网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地址相关推荐
- linux/windows_ip查看(公网ip/私网ip)/通过域名查找ip/解读tracert 的返回结果
linux/windows_ip查看(公网ip/私网ip)/通过域名查找ip/解读tracert 的返回结果 references [How to Check the IP Address in Li ...
- 03. 路由 · 网络 · 公网IP · 私网IP · NAT
路由 · 网络 · NAT 路由 练习1 - 让4台主机之间可以互相通信 练习2 - 让4台主机之间可以互相通信 数据包的传输过程(简述) 第一个包的丢失 网络.互联网 .因特网 ISP 服务器 网络 ...
- 网络基础:数据链路层_公网i私网ip、路由通信、MTU以及ip分片
在本章节开始前,先提出几个问题: 公网ip和私网ip的区别是什么,哪个能重复哪个不能? 如何实现两个设备之间的信息通信? 是通过公网ip查找还是私网ip查找? 路由表包含的信息有哪些? ARP协议的作 ...
- 百度查到的ip和ipconfig查到的不一样,公网ip 私网ip
公网IP是在公网中使用的IP地址,一个可直接访问其他IP,也可被其他IP直接访问的一个独立身份.有了它,你可以直接找到互联网中的其他电脑,也可以被其他电脑找到私网IP是在局域网中使用的IP地址. 而私 ...
- 公网和私网ip地址范围
公网地址的范围: A类:地址范围1.0.0.0~127.255.255.255,主要分配给主机数量多.局域网数量少的大型网络; B类:地址范围为128.0.0.0至191.255.255.255,一般 ...
- android获取设备eth0,eth1,wlan0的IP地址
在做一些跟网络相关的需求时,很多时候需要获取到相关网络类型的IP地址,如下图: 这个时候用什么方法来获取这个IP地址呢?楼主在之前的开发中,找到了以下方法,代码如下,仅供参考: /*** Get Ip ...
- 路由、 网络、互联网、因特网、公网私网IP、NAT技术
路由 在不同网段之间转发数据,需要有路由器的支持 默认情况下,路由器只知道跟他直连的网段,非直连的网段需要通过静态路由.动态路由告诉它. 静态路由 管理员手动添加路由信息(路由表) 适用于小规模网络 ...
- 公网ip与私网ip区别联系
一般的私网的网段 100.0.0.0 10.0.0.0 172.16.0.0 192.168.0.0 什么是公网ip 有了公网ip,那么在互联网上你的宽带就有一个唯一的ip地址,家庭的宽带的公网ip地 ...
- 公网IP和私网IP有什么区别?
关键词 IP分类 公网IP 私网IP 内网IP 局域网IP public ip address private ip address 什么是公网IP ? 公网IP是全球唯一的,只能分配给一台设备,是用 ...
最新文章
- windows reload()
- (转)基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出...
- 洛谷P1690 贪婪的Copy 题解
- 线程池 Future 带返回结果
- Pandas循环提速 7 万多倍是怎么实现的?
- for循环提高内存访问效率的做法
- ofd阅读器qt_GitHub - gogo123150/ofdEditor: 一个很简陋的ofdEditor
- 前端开发常见的英语单词汇总
- Python实现k均值聚类算法_K-Means聚类算法
- 线性表的链式存储结构 ( 链表 )
- Linux Kernel Atomic解析
- android实现微信付款功能,Android实现微信支付功能详解
- [心得]AUP Unix编程艺术知识整理
- 2019年DevOps最新现状研究报告解读
- 锅炉软化水不合格是怎么回事?该如何解决?
- fastjson解析多层对象中的属性
- 谷歌排名影响因素最新研究(SEM RUSH版)
- MATLAB学习0基础
- hdu 多校赛 第二场
- 联想禁止 win10 更新 v2.11 免费版