根据IP判断地理位置
2017-04-24 18:31
316 查看
根据IP判断地理位置
首先,当然是要有IP数据库,指明某一段IP代表哪个地方,本文采用的是txt格式的数据文件IP数据库中的IP全部转换成了Long型,并且经过排序,这是为了方便二分查找
初始化操作: 载入IP数据文件
将数据文件按行读入内存,IP数据文件的格式如下:起始IP | 结束IP | 国家 | 省 | 市 | 区 | 未知 | 运营商 |
---|---|---|---|---|---|---|---|
10000000 | 20000000 | 中国 | 北京市 | 北京市 | 海淀区 | 未知 | 电信 |
ipFile = new File(Class.forName("IPMapping").getClassLoader().getResource("ip_standard.txt").getFile()); List<String> lines = null; lines = Files.readLines(ipFile, Charsets.UTF_8);
遍历每一行信息后存放在
ImmutableList中:
static ImmutableList<Long> START_IP_INDEX; static ImmutableList<Long> END_IP_INDEX; static ImmutableList<String> IP_INFO; START_IP_INDEX = new ImmutableList.Builder<Long>().addAll(startIpIndexTmp.iterator()).build(); END_IP_INDEX = new ImmutableList.Builder<Long>().addAll(endIpIndexTmp.iterator()).build(); IP_INFO = new ImmutableList.Builder<String>().addAll(ipInfoTmp.iterator()).build();
判断IP的准确性
需要查找的IP为标准的XXX.XXX.XXX.XXX格式
在进行查找之前需要判断该IP字符串是否有效:
public static boolean isValid(String ipStr) { if (StringUtils.isBlank(ipStr)) return false; final String IP_FORMAT = "((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; return (ipStr.matches(IP_FORMAT)) ? true : false; }
有效的IP字符串可以转化成Long型
public static long ip2long(String ipStr) { Long ipInLong = 0L; if (isValid(ipStr)) { String[] partIp = StringUtils.split(ipStr.trim(), "\\."); for (int i = 0; i < 4; i++) ipInLong = ipInLong << 8 | Integer.parseInt(partIp[i]); } return ipInLong; }
通过二分查找判断该IP是否有对应的信息
和普通的二分相比,键的值是一对数,而且这对数的左值小于等于右值改下了二分查找如下:
public int binarySearch(long ip) { int low = 0; int high = START_IP_INDEX.size() - 1; while (low <= high) { int middle = (low + high) / 2; if (ip >= START_IP_INDEX.get(middle) && (ip <= END_IP_INDEX.get(middle))) return middle; if (ip < START_IP_INDEX.get(middle)) high = middle - 1; else low = middle + 1; } return -1; }
相关文章推荐
- 基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用
- 基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用
- java根据ip获取地理位置
- Node.js和PHP根据ip获取地理位置的方法
- 根据IP获取地理位置
- 根据ip获取用户地理位置
- php根据二分查找法从普通csv文件中获取ip的地理位置(效率比使用mysql提高近800倍)
- js实现PC端根据IP定位当前城市地理位置
- js实现PC端根据IP定位当前城市地理位置
- c#实现根据网络IP显示地理位置功能示例
- Android根据IP获取地理位置,精确到经纬度
- nginx根据客户端ip地理位置转发到不同服务器上(Geoip+nginx)
- 根据ip获取地理位置
- php根据ip获取地理位置
- java脚本开发根据客户IP获取IP的具体地理位置信息
- c#实现根据网络IP显示地理位置功能
- ASP.NET2.0中根据IP来获取客户的地理位置
- java根据url获取json对象 java根据ip获取地理位置
- 根据IP获取地理位置——Java实现
- 根据IP查地理位置信息