做了一段时间的数据统计功能,无论是apache,还是tomcat,在记录日志的过程中都有IP被记录,目前大多数软件的后台都要求统计一下,数据的来源是从哪些城市过来的,所以要用到IP库。以前一直以为这个东西一定是购买的,后来在网上终于找到了免费的,还是还位仁兄特意写了java的代码用来参考!在些表示感谢!
转载地址:
http://www.blogjava.net/alvin/archive/2007/08/23/141139.html
import java.io.*;
public class QQWry {
private String DbPath = "D:\\Downloads\\IPLook\\QQWry.Dat" + ""; // 纯真IP数据库地址
private String Country, LocalStr;
private long IPN;
private int RecordCount, CountryFlag;
private long RangE, RangB, OffSet, StartIP, EndIP, FirstStartIP,
LastStartIP, EndIPOff;
private RandomAccessFile fis;
private byte[] buff;
private long B2L(byte[] b) {
long ret = 0;
for (int i = 0; i < b.length; i++) {
long t = 1L;
for (int j = 0; j < i; j++)
t = t * 256L;
ret += ((b[i] < 0) ? 256 + b[i] : b[i]) * t;
}
return ret;
}
private long ipToInt(String ip) {
String[] arr = ip.split("\\.");
long ret = 0;
for (int i = 0; i < arr.length; i++) {
long l = 1;
for (int j = 0; j < i; j++)
l *= 256;
try {
ret += Long.parseLong(arr[arr.length - i - 1]) * l;
} catch (Exception e) {
ret += 0;
}
}
return ret;
}
public void seek(String ip) throws Exception {
this.IPN = ipToInt(ip);
fis = new RandomAccessFile(this.DbPath, "r");
buff = new byte[4];
fis.seek(0);
fis.read(buff);
FirstStartIP = this.B2L(buff);
fis.read(buff);
LastStartIP = this.B2L(buff);
RecordCount = (int) ((LastStartIP - FirstStartIP) / 7);
if (RecordCount <= 1) {
LocalStr = Country = "未知";
throw new Exception();
}
RangB = 0;
RangE = RecordCount;
long RecNo;
do {
RecNo = (RangB + RangE) / 2;
getStartIP(RecNo);
if (IPN == StartIP) {
RangB = RecNo;
break;
}
if (IPN > StartIP)
RangB = RecNo;
else
RangE = RecNo;
} while (RangB < RangE - 1);
getStartIP(RangB);
getEndIP();
getCountry(IPN);
fis.close();
}
private String getFlagStr(long OffSet) throws IOException {
int flag = 0;
do {
fis.seek(OffSet);
buff = new byte[1];
fis.read(buff);
flag = (buff[0] < 0) ? 256 + buff[0] : buff[0];
if (flag == 1 || flag == 2) {
buff = new byte[3];
fis.read(buff);
if (flag == 2) {
CountryFlag = 2;
EndIPOff = OffSet - 4;
}
OffSet = this.B2L(buff);
} else
break;
} while (true);
if (OffSet < 12) {
return "";
} else {
fis.seek(OffSet);
return getStr();
}
}
private String getStr() throws IOException {
long l = fis.length();
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
byte c = fis.readByte();
do {
byteout.write(c);
c = fis.readByte();
} while (c != 0 && fis.getFilePointer() < l);
return byteout.toString();
}
private void getCountry(long ip) throws IOException {
if (CountryFlag == 1 || CountryFlag == 2) {
Country = getFlagStr(EndIPOff + 4);
if (CountryFlag == 1) {
LocalStr = getFlagStr(fis.getFilePointer());
if (IPN >= ipToInt("255.255.255.0")
&& IPN <= ipToInt("255.255.255.255")) {
LocalStr = getFlagStr(EndIPOff + 21);
Country = getFlagStr(EndIPOff + 12);
}
} else {
LocalStr = getFlagStr(EndIPOff +
;
}
} else {
Country = getFlagStr(EndIPOff + 4);
LocalStr = getFlagStr(fis.getFilePointer());
}
}
private long getEndIP() throws IOException {
fis.seek(EndIPOff);
buff = new byte[4];
fis.read(buff);
EndIP = this.B2L(buff);
buff = new byte[1];
fis.read(buff);
CountryFlag = (buff[0] < 0) ? 256 + buff[0] : buff[0];
return EndIP;
}
private long getStartIP(long RecNo) throws IOException {
OffSet = FirstStartIP + RecNo * 7;
fis.seek(OffSet);
buff = new byte[4];
fis.read(buff);
StartIP = this.B2L(buff);
buff = new byte[3];
fis.read(buff);
EndIPOff = this.B2L(buff);
return StartIP;
}
public String getLocal() {
return this.LocalStr;
}
public String getCountry() {
return this.Country;
}
public void setPath(String path) {
this.DbPath = path;
}
public static void main(String[] args) throws Exception {
QQWry w = new QQWry();
// w.setPath(new File("QQWry2.Dat").getAbsolutePath());
w.seek("219.232.233.103");
System.out.println(w.getCountry() + " " + w.getLocal());
}
}
分享到:
- 2008-04-02 15:52
- 浏览 1537
- 评论(0)
- 论坛回复 / 浏览 (0 / 4226)
- 查看更多
相关推荐
在IT行业中,IP库查询IP所在地是一个常见的需求,特别是在网络安全、数据分析、地理位置服务等领域。IP地址,即Internet Protocol Address,是互联网上的唯一标识符,它能够帮助我们追踪和定位网络设备的位置。本...
软件:中国知音IP库查询 软件说明:类似:纯真IP库查询工具,但是我加了IP段搜索出来自动处理功能,导出保存功能。我觉得会方便大家使用。 By:中国知音 http://www.bycnboy.com
【VB版纯真IP库查询】是一个基于Visual Basic(VB)开发的小程序,主要用于查询IP地址对应的地理位置信息。这个程序的核心功能是利用“纯真IP库”(ZhenZhen IP Database),这是一个由国内用户广泛使用的IP地址...
标题中的“中国知音活跃IP库查询”表明这是一个专门针对中国的活跃IP地址集合,可能用于网络分析、网络安全或网络管理等目的。活跃IP库通常包含正在互联网上活动的IP地址,这些地址可能与服务器、设备或者用户的在线...
运用Python脚本对纯真IP库进行 IP查询,导出文本
IP库名称为:qqwry.dat 升级IP库:update_ip.exe 让update_ip.exe和qqwry.dat同一目录下 update_ip.exe用于升级QQip库的,每隔五天可以升级一次 先在本机电脑升级后,再把升级完的IP库上传到你的...
标题中的“PHP利用纯真IP数据库在本地实现IP地址信息查询”是指通过PHP编程语言,结合纯真IP数据库,实现在本地服务器上查询IP地址详细信息的功能。纯真IP数据库通常是中国的一个开源IP数据库,包含了丰富的IP地址段...
查询手机号码归属地和ip归属地 还不错 能用了。。。。。。。。。
抓到鸡的多少和IP活不活跃是有密切联系的! 自己去感觉!本资源仅供参考学习!
例如,防止恶意攻击,限制频繁的IP库查询,优化查询效率,以及遵守隐私政策等。 总结来说,“解析IP库跳转”是网络服务中的一种策略,通过识别用户所在的网络运营商,提供定制化的服务体验。这需要对IP库解析、网络...
在使用这个"纯真IP"查找库时,开发者通常会通过API接口或者本地数据库文件来获取和查询IP信息。例如,可以编写程序在接收到一个IP请求时,查询该IP的地理位置,从而实现一些功能,如阻止特定地区的访问、统计用户...
在IT行业中,IP库信息免费查询是一个非常实用的功能,尤其对于网络监控、地理位置分析和网络安全等领域。本资源提供了一个基于Java实现的工具类,用于全球范围内的IP信息查询,并且包含了一个IP库文件,用于存储大量...
本项目涉及的是“C# IP库地址查询”,这是一个关于如何在C#应用程序中实现IP地址到地理位置信息转换的功能。这个功能通常用于网站访问统计、网络安全分析或者个性化用户体验等方面。 1. **IP地址与地理位置关联** ...
标题中的“IP地址查询库”指的是一个用于查询和处理IP地址的软件或库,它能够帮助用户获取关于全球IP地址的信息。在IT行业中,这样的工具通常包含了一个IP数据库,这个数据库包含了世界各地的IP地址及其对应的地理...
“查询本地库QQWry.dat”是一种常见的本地IP库查询方式。QQWry是一个包含大量IP地址及其对应地理位置信息的数据库文件,它被广泛用于快速查询IP地址的归属地。使用本地IP库的优点是速度快,不依赖网络,但数据可能...
标题中的“使用纯真IP库的bat文件实现IP查询”是指通过编写批处理脚本(.bat文件)来利用纯真IP数据库进行IP地址查询的一种技术。纯真IP数据库是中国较为广泛使用的免费IP地址信息数据库,它包含了大量IP地址与对应...
标题中的“ip查询库java版(含IP地址库)”指的是一个Java实现的IP查询库,它包含了一个IP地址数据库,可以用于根据输入的IP地址获取对应国家、地区和详细地址等信息。这样的库在Web应用、网络安全分析或者网络日志...
用于查询纯真IP数据库(http://www.cz88.net) 的程序。从LumaQQ的Java程序段翻译过来。现在从地址反查到IP的速度还比较慢,又进一步优化的必要。原程序内含原Java代码供参考。用的是VS2005。VS2003无法打开项目,可以...
"最新纯真IP库及ASP.NET查询程序"这个标题表明这是一个基于ASP.NET技术开发的IP地址查询工具,它包含了“纯真IP库”,这是一个由中国互联网用户广泛使用的IP地址数据库,用于识别和定位来自不同地区的IP地址。...
标题"java IP 库 ip"指的是使用Java来处理IP相关的功能,而描述中的"java获取ip,离线文件数据库,代码已写好"暗示我们有一个离线数据库用于IP查询,这通常涉及到IP到地理位置的映射。标签"java IP 库 ip ipaddress...