这篇文章主要介绍“使用ip-attribution.dat文件实现IP归属地查询”,在日常操作中,相信很多人在使用ip-attribution.dat文件实现IP归属地查询问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”使用ip-attribution.dat文件实现IP归属地查询”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
使用ip-attribution.dat文件实现IP归属地查询。下载地址
网盘下载 提取码:2chr
package com.sky.common.utils; import cn.hutool.core.io.resource.ClassPathResource; import org.apache.commons.lang3.StringUtils; import java.io.*; import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * ip归属地解析 * * @author Moses wsj1198878990@126.com * @since 1.0.0 2019-10-22 */ public final class IPDataHandler { private static DataInputStream inputStream = null; private static long fileLength = -1; private static int dataLength = -1; private static Map<String, String> cacheMap = null; private static byte[] allData = null; static { // File file = new File(IP_DATA_PATH); try { //把文件放到src/main/resources下面 File file = new ClassPathResource("ip-attribution.dat").getFile(); inputStream = new DataInputStream(new FileInputStream(file)); fileLength = file.length(); cacheMap = new HashMap<String, String>(); if (fileLength > Integer.MAX_VALUE) { throw new Exception("the filelength over 2GB"); } dataLength = (int) fileLength; allData = new byte[dataLength]; inputStream.read(allData, 0, dataLength); dataLength = (int) getbytesTolong(allData, 0, 4, ByteOrder.BIG_ENDIAN); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private static long getbytesTolong(byte[] bytes, int offerSet, int size, ByteOrder byteOrder) { if ((offerSet + size) > bytes.length || size <= 0) { return -1; } byte[] b = new byte[size]; for (int i = 0; i < b.length; i++) { b[i] = bytes[offerSet + i]; } ByteBuffer byteBuffer = ByteBuffer.wrap(b); byteBuffer.order(byteOrder); long temp = -1; if (byteBuffer.hasRemaining()) { temp = byteBuffer.getInt(); } return temp; } private static long ip2long(String ip) throws UnknownHostException { InetAddress address = InetAddress.getByName(ip); byte[] bytes = address.getAddress(); long reslut = getbytesTolong(bytes, 0, 4, ByteOrder.BIG_ENDIAN); return reslut; } private static int getIntByBytes(byte[] b, int offSet) { if (b == null || (b.length < (offSet + 3))) { return -1; } byte[] bytes = Arrays.copyOfRange(allData, offSet, offSet + 3); byte[] bs = new byte[4]; bs[3] = 0; for (int i = 0; i < 3; i++) { bs[i] = bytes[i]; } return (int) getbytesTolong(bs, 0, 4, ByteOrder.LITTLE_ENDIAN); } public static String findGeography(String address) { if (StringUtils.isBlank(address)) { return "illegal address"; } if (dataLength < 4 || allData == null) { return "illegal ip data"; } String ip = "127.0.0.1"; try { ip = Inet4Address.getByName(address).getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } String[] ipArray = StringUtils.split(ip, "."); int ipHeadValue = Integer.parseInt(ipArray[0]); if (ipArray.length != 4 || ipHeadValue < 0 || ipHeadValue > 255) { return "illegal ip"; } if (cacheMap.containsKey(ip)) { return cacheMap.get(ip); } long numIp = 1; try { numIp = ip2long(address); } catch (UnknownHostException e1) { e1.printStackTrace(); } int tempOffSet = ipHeadValue * 4 + 4; long start = getbytesTolong(allData, tempOffSet, 4, ByteOrder.LITTLE_ENDIAN); int max_len = dataLength - 1028; long resultOffSet = 0; int resultSize = 0; for (start = start * 8 + 1024; start < max_len; start += 8) { if (getbytesTolong(allData, (int) start + 4, 4, ByteOrder.BIG_ENDIAN) >= numIp) { resultOffSet = getIntByBytes(allData, (int) (start + 4 + 4)); resultSize = (char) allData[(int) start + 7 + 4]; break; } } if (resultOffSet <= 0) { return "resultOffSet too small"; } byte[] add = Arrays.copyOfRange(allData, (int) (dataLength + resultOffSet - 1024), (int) (dataLength + resultOffSet - 1024 + resultSize)); try { if (add == null) { cacheMap.put(ip, new String("no data found!!")); } else { cacheMap.put(ip, new String(add, "UTF-8")); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return cacheMap.get(ip); } public static void main(String[] args) { String s = findGeography("61.164.169.58"); System.out.println(s.trim()); } }
到此,关于“使用ip-attribution.dat文件实现IP归属地查询”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。