遇到很多的ip转换国家的第三方接口,好多都对访问有限制,频繁的调用第三方接口会直接别拉入黑名单,这样无法再继续使用,于是有新的办法,用纯真数据库,把ip国家存到数据库中,读取数据库来实现转换,我们只需要定期更新数据库即可,这样就避免了调用第三方接口频繁而被拉黑的尴尬.
1.首先生成纯真数据
利用程序生成dat数据库文件,定时更新即可(数据库文件网上可以直接收拾到…程序上传不了.)
2.将以下类放入项目中
实体类:
package com.faith.utiliy;
lic class IPEntry {
public String beginIp;
public String endIp;
public String country;
public String area;
/**
* 构造函数
*/
public IPEntry() {
beginIp = endIp = country = area = "";
}
}
3.封装ip相关信息:
package com.faith.utiliy;
public class IPLocation {
private String country;
private String area;
public IPLocation() {
country = area = "";
}
public IPLocation getCopy() {
IPLocation ret = new IPLocation();
ret.country = country;
ret.area = area;
return ret;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getArea() {
return area;
}
public void setArea(String area) {
//如果为局域网,纯真IP地址库的地区会显示CZ88.NET,这里把它去掉
if(area.trim().equals("CZ88.NET")){
this.area="本机或本网络";
}else{
this.area = area;
}
}
}
4.数据库文件的读取:
package com.faith.utiliy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class IPSeeker {
// 纯真IP数据库名
private String IP_FILE = “QQWry.Dat”;
// 保存的文件夹
private String INSTALL_DIR = “D:\check\”;
// 一些固定常量,比如记录长度等等
private static final int IP_RECORD_LENGTH = 7;
private static final byte REDIRECT_MODE_1 = 0x01;
private static final byte REDIRECT_MODE_2 = 0x02;
// 用来做为cache,查询一个ip时首先查看cache,以减少不必要的重复查找
private Map<String, IPLocation> ipCache;
// 随机文件访问类
private RandomAccessFile ipFile;
// 内存映射文件
private MappedByteBuffer mbb;
// 起始地区的开始和结束的绝对偏移
private long ipBegin, ipEnd;
// 为提高效率而采用的临时变量
private IPLocation loc;
private byte[] buf;
private byte[] b4;
private byte[] b3;
private void setDefaultInstallDir() {
String path = this.getClass().getProtectionDomain().getCodeSource()
.getLocation().getPath();
if (path.indexOf("WEB-INF") > 0) {
path = path.substring(1, path.indexOf("/WEB-INF/"));
}
this.INSTALL_DIR = path + "/qqwry";
}
//纯真数据库名,和地址
public IPSeeker(String fileName, String dir) {
if(fileName!=null && !fileName.equals("")){
this.IP_FILE = fileName;
}
if(dir!=null && !dir.equals("")){
this.INSTALL_DIR = dir;
}else{
this.setDefaultInstallDir();
}
ipCache = new HashMap<String, IPLocation>();
loc = new IPLocation();
buf = new byte[100];
b4 = new byte[4];
b3 = new byte[3];
try {
ipFile = new RandomAccessFile(IP_FILE, "r");
} catch (FileNotFoundException e) {
// 如果找不到这个文件,再尝试再当前目录下搜索,这次全部改用小写文件名
// 因为有些系统可能区分大小写导致找不到ip地址信息文件
String filename = new File(IP_FILE).getName().toLowerCase();
File[] files = new File(INSTALL_DIR).listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
if (files[i].getName().toLowerCase().equals(filename)) {
try {
ipFile = new RandomAccessFile(files[i], "r");
} catch (FileNotFoundException e1) {
ipFile = null;
}
break;
}
}
}
}
// 如果打开文件成功,读取文件头信息
if (ipFile != null) {
try {
ipBegin = readLong4(0);
ipEnd = readLong4(4);
if (ipBegin == -1 ||