`
liudaoru
  • 浏览: 1560396 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IP地址查询数据库[z]

    博客分类:
  • java
阅读更多

http://topic.csdn.net/u/20070415/19/747769f0-e0e9-4384-8c04-af84e5682d1f.html

 

结合QQwry.dat
 
package   cn.lync.ecollege.comm; 

import   java.io.*; 
import   java.net.*; 
import   java.util.*; 

public   class   QueryIP   { 
        
        public   IPLocation   loc=   new   IPLocation(); 
        
        public   RandomAccessFile   ipFile   =   null; 
        
        private   static   byte   REDIRECT_MODE_1   =   0x01; 
        
        private   static   byte   REDIRECT_MODE_2   =   0x02; 
        
        private   byte[]   buf   =   new   byte[256]; 
        
        private   byte[]   b3   =   new   byte[3]; 
        
        private   byte[]   b4   =   new   byte[4]; 
        
        public     PrintWriter   file_out   =   null; 
        
        
        public   static   void   main(String[]   args)   throws   Exception{ 
                long   begin_time   =   System.currentTimeMillis(); 
                QueryIP   queryIP   =   new   QueryIP(); 
                //queryIP.query(); 
                queryIP.query2( "211.67.81.4 "); 
                long   end_time   =   System.currentTimeMillis(); 
                System.out.println( "Total   time   is   "+   (end_time-begin_time)   + "ms "); 
        } 
        
        public   void   query()throws   Exception{ 
                ipFile   =   new   RandomAccessFile( "QQWry.Dat ", "r "); 
                file_out   =   new   PrintWriter( "out.csv "); 
                long   index_begin_off   =   readLong4(0); 
                long   index_end_off   =   readLong4(4); 
                
                System.out.println( "index_begin_off   = "+index_begin_off); 
                System.out.println( "index_end_off   = "+index_end_off); 
                
                for(long   i=index_begin_off;   i <index_end_off;   i+=7){ 
                        byte[]   ip_start   =   new   byte[4]; 
                        byte[]   ip_end   =   new   byte[4]; 
                        
                        ipFile.seek(i); 
                        ipFile.readFully(ip_start); 
                        long   ip_record_off   =   readLong3(); 
                        
                        ipFile.seek(ip_record_off); 
                        ipFile.readFully(ip_end); 
                        
                        ip_start   =   toNetOrder(ip_start); 
                        ip_end   =   toNetOrder(ip_end); 
                        
                        IPLocation   loc_get   =   getIPLocation(   ip_record_off   ); 
                        file_out.println(   getDotedIP(   ip_start   )+   ", "+getDotedIP(ip_end   )   +   ", "+     loc_get.country   +   ", "   +   loc_get.area); 
                } 
                
                //long   begin_off   =   readLong3(index_end_off+4); 
                
                //IPLocation   test_loc   =   getIPLocation(begin_off); 
                //System.out.println( "COUNTRY= "   +test_loc.country); 
                //System.out.println( "AREA= "   +test_loc.area); 
        } 
        
        public   Hashtable   query2(String   dotted_ip)throws   Exception{ 
                Hashtable   ret_hash   =   new   Hashtable(); 
                
                byte[]   ip_array   =   new   byte[4]; 
                ip_array   =   InetAddress.getByName(dotted_ip).getAddress(); 
                
                ipFile   =   new   RandomAccessFile(new   CommonObjects().CLASSES_ROOT+ "QQWry.Dat ", "r "); 
                //file_out   =   new   PrintWriter( "out.csv "); 
                long   index_begin_off   =   readLong4(0); 
                long   index_end_off   =   readLong4(4); 
                
                //System.out.println( "index_begin_off   = "+index_begin_off); 
                //System.out.println( "index_end_off   = "+index_end_off); 
                
                long   start_num   =   index_begin_off; 
                long   end_num   =   index_end_off; 
                
                for(long   i=start_num;   i <=end_num;   i+=7){     
                      
                        byte[]   ip_start   =   new   byte[4]; 
                        byte[]   ip_end   =   new   byte[4]; 
                        
                        ipFile.seek(i); 
                        ipFile.readFully(ip_start); 
                        long   ip_record_off   =   readLong3(i+4); 
                        
                        ipFile.seek(ip_record_off); 
                        ipFile.readFully(ip_end); 
                        
                        ip_start   =   toNetOrder(ip_start); 
                        ip_end   =   toNetOrder(ip_end); 
                        
                        //   Only   search   half:   first-half   OR   second-half 
//                         long   half_index_off   =   i   +   (   (index_end_off-i)/14   )   *   7   ; 
//                         if(   ip_array[0] <ip_start[0]   )   {         
//                                 i=half_index_off; 
//                         }else{ 
//                                 i=half_index_off; 
//                         } 
                        
                        if(   ip_start[0]> =ip_array[0]   &&   ip_array[0] <=ip_end[0]   ){ 
                                if(   ip_start[1]> =ip_array[1]   &&   ip_array[1] <=ip_end[1]   ){ 
                                        if(   getLong4(ip_array)> =getLong4(ip_start)   &&   getLong4(ip_array) <=getLong4(ip_end))   { 
                                                //System.out.println( "ip_start   =   [ "+getDotedIP(ip_start)+ "] "); 
                                                //System.out.println( "ip_end   =   [ "+getDotedIP(ip_end)+ "] "); 
                                                //System.out.println( "ip_array   =   [ "+getDotedIP(ip_array)+ "] "); 
                                                
                                                IPLocation   loc_get   =   getIPLocation(   ip_record_off   ); 
                                                                
                                                //System.out.println( "COUNTRY= "   +loc_get.country); 
                                                //System.out.println( "AREA= "   +loc_get.area); 
                                                ret_hash.put( "COUNTRY ",loc_get.country); 
                                                ret_hash.put( "AREA ",loc_get.area); 
                                                break; 
                                        } 
                                } 
                        } 
                
                } 
                
                long   info_index   =   readLong3(index_end_off+4); 
                IPLocation   loc_info   =   getIPLocation(   info_index   ); 
                //System.out.println(loc_info.country   +   ", "   +loc_info.area); 
                ret_hash.put( "IP_INFO_SOURCE ",loc_info.country   +   ", "   +loc_info.area); 
                return   ret_hash; 

        }         
        
        public   String   getDotedIP(   byte[]   ip_addr)   throws   Exception   { 
                  return   InetAddress.getByAddress(ip_addr).getHostAddress(); 
        } 
        
/** 
  *   给定一个ip国家地区记录的偏移,返回一个IPLocation结构 
  *   @param   offset   国家记录的起始偏移 
  *   @return   IPLocation对象 
  */ 
private   IPLocation   getIPLocation(long   offset)   { 
try   { 
//   跳过4字节ip 
ipFile.seek(offset   +   4); 
//   读取第一个字节判断是否标志字节 
byte   b   =   ipFile.readByte(); 
if(b   ==   REDIRECT_MODE_1)   { 
//   读取国家偏移 
long   countryOffset   =   readLong3(); 
//   跳转至偏移处 
ipFile.seek(countryOffset); 
//   再检查一次标志字节,因为这个时候这个地方仍然可能是个重定向 
b   =   ipFile.readByte(); 
if(b   ==   REDIRECT_MODE_2)   { 
loc.country   =   readString(readLong3()); 
ipFile.seek(countryOffset   +   4); 
}   else 
loc.country   =   readString(countryOffset); 
//   读取地区标志 
loc.area   =   readArea(ipFile.getFilePointer()); 
}   else   if(b   ==   REDIRECT_MODE_2)   { 
loc.country   =   readString(readLong3()); 
loc.area   =   readArea(offset   +   8); 
}   else   { 
loc.country   =   readString(ipFile.getFilePointer()   -   1); 
loc.area   =   readArea(ipFile.getFilePointer()); 
} 
return   loc; 
}   catch   (IOException   e)   { 
return   null; 
} 
} 

/** 
  *   从offset偏移开始解析后面的字节,读出一个地区名 
  *   @param   offset   地区记录的起始偏移 
  *   @return   地区名字符串 
  *   @throws   IOException   地区名字符串 
  */ 
private   String   readArea(long   offset)   throws   IOException   { 
ipFile.seek(offset); 
byte   b   =   ipFile.readByte(); 
if(b   ==   REDIRECT_MODE_1   ||   b   ==   REDIRECT_MODE_2)   { 
long   areaOffset   =   readLong3(offset   +   1); 
if(areaOffset   ==   0) 
//return   LumaQQ.getString( "unknown.area "); 
return   "unknown   area "; 
else 
return   readString(areaOffset); 
}   else 
return   readString(offset); 
} 

/** 
  *   从offset位置读取3个字节为一个long,因为java为big-endian格式,所以没办法 
  *   用了这么一个函数来做转换 
  *   @param   offset   整数的起始偏移 
  *   @return   读取的long值,返回-1表示读取文件失败 
  */ 
private   long   readLong3(long   offset)   { 
long   ret   =   0; 
try   { 
ipFile.seek(offset); 
ipFile.readFully(b3); 
ret   |=   (b3[0]   &   0xFF); 
ret   |=   ((b3[1]   < <   8)   &   0xFF00); 
ret   |=   ((b3[2]   < <   16)   &   0xFF0000); 
return   ret; 
}   catch   (IOException   e)   { 
return   -1; 
} 
} 
 
 

分享到:
评论
1 楼 Jatula 2008-11-05  
IPLocation
这个类也贴出来吗;

相关推荐

    纯真IP地址数据库

    扫描IP地址, 宽带Z,必备神器,好处自己下了寻思吧

    QQ IP数据库 纯真版 2014-08-30更新

    QQ IP数据库 纯真版 可随时查看最新IP地址,查询IP归属地

    QQip数据库

    收集了包括中国电信、中国移动、中国联通、长城宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括最全的网吧数据。

    iplocalhost.7z

    PHP本地实现IP地址信息查询(纯真IP数据库, 不依赖composer,无乱码)

    ip_addr-20200410.7z

    IP地址库(基于纯真数据库和淘宝地址库进行的重制)。精确到市级(国家,省,市),包含ISP信息(原纯真记录数 &gt; 500000,合并处理后 近30w)

    ip_addr-20200325.7z

    IP地址库(基于纯真数据库和淘宝地址库进行的重制)。精确到市级(国家,省,市),包含ISP信息(原纯真记录数 &gt; 500000,合并处理后 近30w)

    ip_addr-20190718.7z

    IP地址值库(基于纯真数据库和淘宝地址库进行的重制)。精确到市级(国家,省,市),包含ISP信息(原纯真记录数 &gt; 500000,合并处理后 近30w)

    langip:使用IP地址检测语言

    使用IP地址检测语言[2021年3月更新] :check_mark: 免费且无注册 :check_mark: 快速且无HTTP连接 :check_mark: 零依赖且无限制 :check_mark: ip2Location数据库和可配置的构建 :check_mark: 默认包括阿拉伯文,...

    asp连接数据库代码实例

    连接数据库代码实例 1,连接数据库代码 文件名称 conn.asp 所有访问数据库的文件都调用此文件&lt;!--#include file=\"Conn.asp\"--&gt; db=\"data/data.mdb\" \'数据库存放目录 on error resume next set conn=server...

    Z-Blog 留言评论显示IP地址和性能优化

    前些天的一些突发事件,使得我发现了Z-Blog存在的一个很严重的性能问题,就是当单篇文章日访问量数万的时候,会有大量并发用户同时写Access数据库,会导致数据库死锁,之后的外在表现就是CPU占用猛增。

    Z-Blog 2.0 Doomsday Build 121221

    是的,Z-Blog 2.0程序完全支持MSSQL,大数据库站长再也不需要为支持MSSQL发愁了。 全新的前后台界面 还在因为Z-Blog 1.8的前台后台样式太难看而烦恼吗?快来测试Z-Blog2.0吧!不光是前台主题重新制作,后台样式也...

    C#课设项目-基于ASP.NET开发的EasyCms后台权限管理系统源码+项目说明+sql数据库.zip

    + 登录使用了ip2region来解析登录ip地址,请将data/ip2region.db 数据库文件放置到站点根目录下,否则无法登录 + 如果启用hangfire任务并且部署到IIS的化请注意应用程序池的设置,避免回收造成资源占用导致站点启动...

    迷你版SQL2000服务器

    +增加按计算机名和IP地址访问实例的参考连接字提示; *修正启动时的一个参数错误,解决日志勾选切换造成启动失败的问题。 1.1.1 ^优化提示信息,更加人性化,执行脚本时会显示正在执行第几个脚本文件; ^优化...

    Okta:编码来自Okta的面试问题

    ip地址的格式为wxyz:port,其中w,x,y,z均为一个字节。 端口必须在(1,65,535)范围内(包括1和65,535)。问题2 设计一个函数来分析日志文件,以检测参与DDoS攻击的IP地址。 该函数应返回每秒发出三个请求并...

    迷你SQL2000

    +增加按计算机名和IP地址访问实例的参考连接字提示; *修正启动时的一个参数错误,解决日志勾选切换造成启动失败的问题。 1.1.1 ^优化提示信息,更加人性化,执行脚本时会显示正在执行第几个脚本文件; ^优化...

    局域网聊天室(带客户端和服务端)

    ⑦打开Client下Client文件夹,编辑ChatRoom.htm、Chatting.htm、RegisterDlg.htm,将里面所有IP地址替换成Xampp所在的主机的IP或者域名。 ⑧重新生成Client工程。 ⑨生成的客户端在Client\Client\Bin目录下,复制到...

    MYSQL常用命令大全

     此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序:  mysql&gt; exit  Bye9! 1:使用SHOW语句找出在服务器上当前存在什么...

    z_sync-android-p2p-example.deprecated

    同步-android-p2p-example ... 运行 netcfg 以获取设备上的 wlan0 IP 地址: adb shell netcfg lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00 dummy0 DOWN 0.0.0.0/0 0x00000082 92:e5:00:cc:2d:20 sit0 DOWN

Global site tag (gtag.js) - Google Analytics