根据IP查询地理位置(简单易懂,详细注解)
昨天写项目,突然看到需求上要求,根据ip获取ip的地理位置,顿时感觉很懵逼(本人是新手),然后就去找度娘求解,虽然过程有点波折,但是还是解决了。下面看一下我们详细的解决步骤(如有不同见解,请大佬指教一下):
1.首先创建好,我们的查询ip地址的工具类:
package com.zr.text;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;/*** 根据IP地址获取详细的地域信息 */
public class AddressUtils {/*** 获取IP所在地址*/public String getAddresses(String content, String encodingString)throws UnsupportedEncodingException {// 淘宝的接口String urlStr = "http://ip.taobao.com/service/getIpInfo.php";String returnStr = this.getResult(urlStr, content, encodingString);if (returnStr != null) {// 处理返回的省市区信息System.out.println(returnStr);String[] temp = returnStr.split(",");if (temp.length < 3) {return "0";// 无效IP,局域网测试}String region = (temp[5].split(":"))[1].replaceAll("\"", "");region = decodeUnicode(region);// 省份String country = "";String area = "";// String region = "";String city = "";String county = "";String isp = "";for (int i = 0; i < temp.length; i++) {switch (i) {case 1:country = (temp[i].split(":"))[2].replaceAll("\"", "");country = decodeUnicode(country);// 国家break;case 3:area = (temp[i].split(":"))[1].replaceAll("\"", "");area = decodeUnicode(area);// 地区break;case 5:region = (temp[i].split(":"))[1].replaceAll("\"", "");region = decodeUnicode(region);// 省份break;case 7:city = (temp[i].split(":"))[1].replaceAll("\"", "");city = decodeUnicode(city);// 市区break;case 9:county = (temp[i].split(":"))[1].replaceAll("\"", "");county = decodeUnicode(county);// 地区break;case 11:isp = (temp[i].split(":"))[1].replaceAll("\"", "");isp = decodeUnicode(isp); // ISP公司break;}}System.out.println(country + "=" + area + "=" + region + "=" + city + "=" + county + "=" + isp);return region;}return null;}/*** 请求接口*/private String getResult(String urlStr, String content, String encoding) {URL url = null;HttpURLConnection connection = null;try {url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection();// 新建连接实例connection.setConnectTimeout(10000);// 设置连接超时时间,单位毫秒connection.setReadTimeout(10000);// 设置读取数据超时时间,单位毫秒connection.setDoOutput(true);// 是否打开输出流 true|falseconnection.setDoInput(true);// 是否打开输入流true|falseconnection.setRequestMethod("POST");// 提交方法POST|GETconnection.setUseCaches(false);// 是否缓存true|falseconnection.connect();// 打开连接端口DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxxout.flush();// 刷新out.close();// 关闭输出流BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));StringBuffer buffer = new StringBuffer();String line = "";while ((line = reader.readLine()) != null) {buffer.append(line);}reader.close();return buffer.toString();} catch (IOException e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();// 关闭连接}}return null;}/*** unicode 转换成 中文*/public static String decodeUnicode(String theString) {char aChar;int len = theString.length();StringBuffer outBuffer = new StringBuffer(len);for (int x = 0; x < len;) {aChar = theString.charAt(x++);if (aChar == '\\') {aChar = theString.charAt(x++);if (aChar == 'u') {int value = 0;for (int i = 0; i < 4; i++) {aChar = theString.charAt(x++);switch (aChar) {case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':value = (value << 4) + aChar - '0';break;case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value = (value << 4) + 10 + aChar - 'a';break;case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':value = (value << 4) + 10 + aChar - 'A';break;default:throw new IllegalArgumentException("Malformed encoding.");}}outBuffer.append((char) value);} else {if (aChar == 't') {aChar = '\t';} else if (aChar == 'r') {aChar = '\r';} else if (aChar == 'n') {aChar = '\n';} else if (aChar == 'f') {aChar = '\f';}outBuffer.append(aChar);}} else {outBuffer.append(aChar);}}return outBuffer.toString();}
}
然后我们创建一个测试类,测试一下:
package com.zr.ces;import java.io.UnsupportedEncodingException;import com.zr.text.AddressUtils;public class PinYinUtil {// 测试public static void main(String[] args) {AddressUtils addressUtils = new AddressUtils();String ip = "123.135.143.226";String address = "";try {address = addressUtils.getAddresses("ip=" + ip, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println(address);//输出结果为:泰安==联通==370900}
}
OK,这样就大功告成啦(但是ip获取位置信息只能获取到==市==),如果想要获取到区的话,还是要获取经纬度,调用接口
根据IP查询地理位置(简单易懂,详细注解)相关推荐
- 根据ip查询地理位置
围绕纯真数据库的一系列小工具 qqwry.c,qqwry.h.一个c实现的lib,用来从纯真数据库里获取ip地址信息.下载,文档 nali,一组ip查询工具,包括可以让dig,traceroute显示 ...
- IP查询地理位置 离线版 非第三方接口 根据IP查地理位置 springboot + MaxMind GeoIP2
相信大家在开发中一定有遇到过查询IP地理位置的需求吧 我看网上很多都是去调用第三方的接口 众所周知调用第三方的接口是完全没有保障性的,你不可能确保别人的服务器不出问题. 所以最好还是要我们自己集成. ...
- python根据IP查询地理位置
实现了输入ip地址返回该ip对应的信息. 如图:解释如下: 打开百度,输入ip 打开调试界面,点击图中3号位置过滤 在图中4号框位置输入想要查询的ip,然后点查询 依次点击图中5.6,找到timest ...
- 根据IP查询地理位置信息
引入库 在build.gradle中引用库 compile 'com.maxmind.geoip2:geoip2:2.8.0' 下载数据库文件. 在GEOIP中有2个版本, 一个是lite(免费), ...
- 主域名和子域名简单易懂详细讲解
安全小白困惑讲解--主域名和子域名 写在前面 这里是新手小白在学习子域名爆破的时候发现对主域名和子域名并没有特别清楚,所以选择写一篇关于主域名和子域名的文章帮助和我有同样困惑的小伙伴们! 一.什么是主 ...
- 使用腾讯IP查询-判断IP归属地-Vic's blog
使用IP获取地理位置信息 最近博客刚写了一个地理信息统计的功能,想看看来访我博客的网友都来自哪些地区,这要用到IP地理信息查询接口,网上有很多大厂(如腾讯,淘宝,搜狐等等)或地理信息机构开放的IP地理 ...
- java通过IP解析地理位置
java通过IP解析地理位置 文章目录 java通过IP解析地理位置 一.获取IP地址 二.百度普通IP定位API获取地理位置 在项目开发中,需要在登录日志或者操作日志中记录客户端ip所在的地理位置. ...
- 通过百度普通IP定位API获取IP的地理位置java根据ip定位地理位置
在项目开发中,需要在登录日志或者操作日志中记录客户端ip所在的地理位置.目前根据ip定位地理位置的第三方api有好几个,淘宝.新浪.百度等,这三种其实也有些缺点的:淘宝,开始几次可以成功根据ip获取对 ...
- linux下最简单多线程单文件socks5代理proxy服务器程序(仅一个c文件,带详细注解)
2020.9.11 网上看的都比较复杂,GITHUB找了一个多线程的相对简单的MicroSocks项目,花了几周时间(没办法,菜鸟一个)改了一下,改成单文件,测试OK. /* wxl_socks5_p ...
- php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)
php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...
最新文章
- Linux下Shell重定向
- 【PC工具】U盘数据加密工具,windows自带U盘文件加密工具体验,测试加密时间...
- win7 计算机库 桌面,【备忘】win7下再硬盘安装win7(桌面库和家庭组图标删除)...
- 利用redis写webshell
- Android之开源视频压缩框架RxFFmpeg的commands设置
- 构建maven项目插件_如何构建一个Maven插件
- 浏览器兼容CSS渐进增强 VS 优雅降级如何选择
- HTML+CSS+JS实现 ❤️贪吃蛇游戏、你能吃过我?❤️【源码送给你一起来玩-建议收藏】
- Mapoutputcollector的几个方法
- 调查:是什么让你对开发者聚会(活动)感兴趣?(转 Y.boy一篇文章)
- 嵌入式学习文章推荐+资料下载
- 游戏策划游戏研发必读经典题文一
- ES工具--kibana
- 机器学习——DEAP数据集
- Scala 034 特质trait
- 办公台式计算机配置费用,原来这才是办公台式机需要的性能?
- 2022虎年头像框制作小程序源码带背景音乐+流量主功能
- iPhone 15 高端版本万元起步;华为授权 OPPO 使用其 5G 技术;DeepMind 推出 AI 编剧|极客头条
- 网页点名器(移动端、pc端)
- 什么显卡是个人计算机的基本配置和市场主流,现在()显卡已经成为了个人计算机的基本配置和市场主流。 - 问答库...