利用纯真IP数据库,通过IP查地址[JAVA]

利用纯真IP数据库,通过IP查地址[JAVA]
这个东东可以让你通过IP查询地址(代码修改自一个 VBS 的 TQQWry 类)
程序代码
package alvin;
import java.io.*;

public class QQWry {
    private String DbPath = "F:\\DB\\QQWry2.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+8);
            }
        } 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("59.39.253.251");
        System.out.println(w.getCountry() + " " + w.getLocal());
    }

}


纯真IP库下载地址见: http://www.ialvin.cn/blog/article.asp?id=135
IP库大小: 6M多

如有问题,请到http://www.ialvin.cn/blog/article.asp?id=135提出

你可能感兴趣的:(利用纯真IP数据库,通过IP查地址[JAVA])