`
liudaoru
  • 浏览: 1575861 次
  • 性别: 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地址数据库"可能就是这样的一个本地化数据库,提供快速查询服务,避免了每次查询都需要连接远程服务器的延迟。 "主界面.bmp"、"设置.bmp"、"托盘处菜单.bmp"这些文件名表明该程序具有直观的用户界面,用户...

    ip.7z ip数据库 可以根据ip获取到相应的省市

    为了使用这个数据库,你需要先解压“ip.7z”文件,然后使用适当的工具(如Python、Java或PHP)读取并解析“ip”文件,接着通过编程接口(API)或者直接查询来获取特定IP地址的位置信息。 总的来说,这个资源为...

    IP IP地址 IP_DATA.7z

    描述中提到的“全球IP地址快速查看”意味着这个IP_DATA文件很可能是包含了全球各个国家和地区的IP地址数据库,方便用户快速查询和定位IP地址所属的地理位置、网络服务提供商等信息。这样的数据对于网络管理员、网络...

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

    QQ IP数据库纯真版是一款专为用户提供的IP地址查询工具,尤其在2014-08-30进行了更新,以确保用户可以获取到最新的IP地址信息,并准确查询到IP地址的归属地。这个数据库主要针对的是中国的IP地址,为用户提供了详尽...

    iplocalhost.7z

    标签中的"ip地址库"表明这个系统的核心是IP地址数据库,用于存储和检索IP地址数据。"php"表示该系统使用的是PHP编程语言,而"ip地址解析"则说明系统的功能是解析和处理IP地址,提供IP到地理位置的转换服务。 在...

    彩虹3引擎纯真IP数据库

    这个数据库包含了海量的IP地址信息,旨在帮助用户识别和过滤来自不同地区的网络连接,通常用于防止垃圾邮件、网络攻击或者进行流量优化等目的。 在描述中提到的“彩虹3引擎”,这是一个特定的IP数据库查询引擎,...

    ip地址换算法

    通过下载并分析`country-ipv4.lst`文件,可以筛选出所有属于中国的IP地址段,从而构建中国IP地址数据库。 #### 实现IP地址归属地判断 有了上述算法和数据库支持,判断一个IP地址是否属于中国就变得简单多了。首先...

    ip_addr-20200410.7z

    “ip_addr-20200410.7z”是一个压缩文件,包含了更新至2020年4月10日的IP地址数据库。这个数据库基于纯真数据库和淘宝地址库进行了重制和整合,目的是提供更准确的地理位置信息。纯真数据库是一个由国内用户贡献的IP...

    ip_addr-20200325.7z

    标题中的“ip_addr-20200325.7z”是一个压缩文件,它包含了一个IP地址库。这个库是基于两个知名的IP数据库——纯真数据库和淘宝地址库——进行整合和重新制作的。20200325表示这个数据集是在2020年3月25日更新的,这...

    ip_addr-20190718.7z

    这通常意味着它是一个更新至该日期的IP地址数据库,可能包含了在此日期前收集和整理的IP地址信息。 描述中提到的“IP地址值库”是这个数据库的核心内容,它是基于“纯真数据库”和“淘宝地址库”进行重制的。纯真...

    QQip数据库

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

    labview与mysql数据库资料.7z

    2. **连接配置**:建立数据库连接需要知道MySQL服务器的IP地址或域名、端口号、数据库名称、用户名和密码。在LabVIEW中,可以通过配置VI(虚拟仪器)来设置这些参数,创建数据库连接。 3. **SQL查询**:LabVIEW中的...

    Cadence OrCAD Capture CIS数据库配置.docx

    5. 通过数据库放置元件,打开任意一张原理图页面,执行快捷键 Z,part code = 料号,双击元件后后即可放入原理图内。 6. Allegro 封装库路径配置,在 Allegro 中任意打开一张.brd 文件,设置 Library 路径,选择 ...

    随机生成对应省份IP的PHP类.7z

    标题提到的"随机生成对应省份IP的PHP类.7z"是一个压缩包,里面包含了一个PHP类,这个类能够实现根据省份随机生成IP地址的功能。 首先,我们需要理解IP地址的结构。IP地址是由32位二进制组成的,通常分为四段,每段8...

    自考数据库系统原理上机实验课《数据库原理》考试要求

    - 连接配置包括指定SQL Server的IP地址(162.105.31.249),并使用预设的登录名(ZKStudy)和密码(ZKStudy)。 4. **表名命名规则**: - 在创建数据库表时,考生需要注意表名的规范性。根据描述,表名需要在前面...

    z最新数据库信息服务合同.doc

    需要检查相关配置是否正确,例如服务器的IP地址、端口号、登录凭据等。 3. **数据库引擎服务**:如果数据库引擎服务没有运行,或者服务启动配置不正确,也会导致无法连接。需要确认SQL Server服务的状态,并检查...

    IP锁定程序实例源码.7z

    标题中的“IP锁定程序实例源码.7z”是一个基于.NET平台的软件开发项目,它提供了对特定IP地址进行访问限制的功能。这个程序的核心在于能够识别用户的IP地址,并根据预设的规则决定是否允许该IP继续访问。描述中提到...

    GeoLite2-Country-CSV_20200707.7z

    GeoLite2-Country-CSV_20200707.7z 是一个压缩包文件,其中包含GeoLite2数据库的2020年7月7日版本,该数据库专门用于提供全球各国的IP地址定位信息。GeoLite2是由MaxMind公司开发的一款免费的IP地理位置数据库,它为...

    Oracle数据库的服务器安装.pdf

    网络配置包括选择网络接口卡、设置IP地址和子网掩码等。例如,在使用Sam工具时,需要选择“Net woki ng and Communi cat i ons”(网络和通信),然后选择“Net work Int erf ace Car ds”(网络接口卡),并选择“l...

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

    在本文中,我们将深入探讨如何解决Z-Blog平台在高并发环境下出现的性能问题,以及如何在评论系统中添加IP地址显示功能。 首先,我们关注的是Z-Blog在处理大量并发用户评论时遇到的性能瓶颈。当一篇博客文章获得数万...

Global site tag (gtag.js) - Google Analytics