聚合 管理  

          Blog Stats

          News

          我使用新博客啦:
          http://www.linjunhai.com/
          大家到我的新博客上看看吧!

          隨筆分類(28)

          文章分類(4)

          隨筆檔案(53)

          文章檔案(4)

          相冊

          相關(guān)鏈接


          林俊海的博客

          超級大菜鳥,每天要自強!

          這個東東可以讓你通過IP查詢地址(代碼修改自一個 VBS 的 TQQWry 類)
          程序代碼 程序代碼
          package alvin;
          import java.io.*;

          public class QQWry {
              private String DbPath = "F:\\DB\\QQWry2.Dat";    //純真IP數(shù)據(jù)庫地址
              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提出
          posted on 2007-08-23 14:58 林俊海 閱讀(4476) 評論(0)  編輯  收藏 所屬分類: JAVA天地
          主站蜘蛛池模板: 金华市| 漾濞| 阳东县| 清涧县| 东莞市| 故城县| 花莲县| 新乡县| 当雄县| 黄龙县| 平定县| 汽车| 平谷区| 临洮县| 青海省| 二手房| 昔阳县| 图木舒克市| 江源县| 桦川县| 丰镇市| 德令哈市| 金沙县| 涟水县| 巴青县| 嘉兴市| 南投县| 安庆市| 沐川县| 锡林浩特市| 贞丰县| 西乌珠穆沁旗| 延边| 同江市| 巴东县| 彭山县| 壤塘县| 庆阳市| 武山县| 苏尼特右旗| 高淳县|