`
crackajack_zg
  • 浏览: 53970 次
社区版块
存档分类
最新评论
阅读更多
想实现一个功能:根据用户在公网上的ip地址对应到该用户所在的行政区划,精确到县。

这个功能能不能实现的关键还是在能不能找到一个数据较为完善的ip地址库。在网上找了一下,还是觉得纯真ip数据库好用。

实现步骤:
1 下载纯真ip数据库,然后解压成文件导入自己建的数据库(见附件)
2 下载全国省市县行政规划(见附件)
3 下载国家编码(见附件)
因为纯真ip数据库与ip对应的省市县是以文字来描述的,所以需要将文字转换为编码

将文字转换为全国省市县行政规划编号(六位)的程序:
package com.auto;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 
 * @author Feng
 *
 */
public class UpdateIPData {
	
	ArrayList<String[]> queryList = new ArrayList<String[]>();

    public static void main(String argv[]) throws SQLException{

        Connection conn = null;
        String url = null;
        String user = null;
        String password = null;
        String sql = null;
        
        
        UpdateIPData imp = new UpdateIPData();

        try {
         Class.forName("com.mysql.jdbc.Driver"); //加载mysq驱动
        } catch (ClassNotFoundException e) {
         System.out.println("驱动加载错误");
         e.printStackTrace();//打印出错详细信息
        }
        try {
            url = "jdbc:mysql://localhost:3306/git_jeeshop?useUnicode=true&characterEncoding=UTF-8";
         user = "root";
         password = "root";
         conn = DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
         System.out.println("数据库链接错误");
         e.printStackTrace();
        }
        
        
        new UpdateIPData().updateCode(conn);
        conn.close();

    }
    
    public void updateCode(Connection conn) throws SQLException {
    	
     
    	//查询出 全国省市编码的编号和区域 ,以便后面做匹配
    	String querySql = "select code,name from t_area ";
    	Statement pstm = conn.createStatement();
    	ResultSet rs = pstm.executeQuery(querySql);
    	while(rs.next()) {
    		String code = rs.getString("code");
    		String name = rs.getString("name");
    		String[] strArray = {code,name};
    		queryList.add(strArray);
    	}
    	

    	//查询出需要修改的数据
		String sql = "select ip_from ,descname,code from t_ipcode where code is null";
		rs = pstm.executeQuery(sql);
    	ArrayList<String[]> updateList = new ArrayList<String[]>();
    	while(rs.next()) {
    		long ipFrom = rs.getLong("ip_from");
    		String descName = rs.getString("descname");
    		String code = rs.getString("code");
    		String[] strArray = {String.valueOf(ipFrom),descName,code};
    		updateList.add(strArray);
    	}
    	
    	
    	//修改数据
    	String updateSql = "update t_ipcode set code =? where ip_from =?";
		PreparedStatement pstm2 = conn.prepareStatement(updateSql);
		conn.setAutoCommit(false);
		List<String[]> provenceData = this.getChildName(null);
		long index = 0;
		System.out.println("----------开始循环t_ipcode表");
		for(String[] strArray:updateList) {//循环t_ipcode表
			index++;
			String descName = strArray[1];//ip地址对应的地区的名字
			String provenceCode = ""; 
			String cityCode = ""; 
			String countryCode = ""; 
			//找省份的编码
			for(String[] provence:provenceData) {
				String code = provence[0];
				String name = provence[1];
				if(descName.contains(name)) {
					//如果找到当前省的code
					provenceCode = code;
				}
			}
			
			if(provenceCode.equals("")) {
				System.out.println("-----------descName:"+descName+"未找到省份编码");
				continue;
			}else {
				//找城市的编码
				List<String[]> cityList =  this.getChildName(provenceCode);
				for(String[] city:cityList) {
					String code = city[0];
					String name = city[1];
					if(descName.contains(name)) {
						//如果找到当前市的code
						cityCode = code;
					}
				}
				if(cityCode.equals("")) {
					pstm2.setLong(2, Long.valueOf(strArray[0]));
					pstm2.setString(1, provenceCode);
					pstm2.addBatch();  
				}else {
					//找县的编码
					List<String[]> countryList =  this.getChildName(cityCode);
					for(String[] country:countryList) {
						String code = country[0];
						String name = country[1];
						if(descName.contains(name)) {
							//如果找到当前县的code
							countryCode = code;
						}
					}
					if(countryCode.equals("")) {
						pstm2.setLong(2, Long.valueOf(strArray[0]));
						pstm2.setString(1, cityCode);
						pstm2.addBatch();  
					}else {
						pstm2.setLong(2, Long.valueOf(strArray[0]));
						pstm2.setString(1, countryCode);
						pstm2.addBatch();  
					}
					
				}
				
				
			}
			
		    
            
            if(index%1000==0) {
                pstm2.executeBatch();  
                System.out.println("已经提交:"+index+"行");
            }
			
           
		
		}
		 pstm2.executeBatch();  

			
		conn.setAutoCommit(true);

         conn.close();
		
    	
    }
     
    /**
     * 获取省市县数据的方法
     * @return
     */
    private List<String[]> getChildName(String code) {
    	
    	List<String[]> list = new ArrayList<String[]>();
    	
    	for(String[] strArray:queryList) {
	    	if(code==null) {
	    		//查找省级数据
				if(strArray[0].endsWith("0000")) {
					String[] s = {strArray[0],strArray[1]};
					list.add(s);
				}
	    	}else {
	    		//查找当前数据的子数据
	    		code = code.replace("0", "");
	    		if(strArray[0].startsWith(code)) {
					String[] s = {strArray[0],strArray[1]};
					list.add(s);
				}
	    	}
    	}
    	return list;
    }
    
}

这段程序遍历纯真ip库的每条记录,匹配每个ip段的所在地址与行政区划的地址,然后根据匹配的结果更新纯真ip库。
分享到:
评论

相关推荐

    纯真IP数据库 查询IP

    2. 城市定位:纯真IP数据库通过将IP地址与地理位置关联,可以提供准确到城市级别的定位服务。这对于网页访问统计、网络安全分析、广告定向等场景具有重要意义。 3. 数据库结构:纯真IP数据库通常以二进制格式存储,...

    纯真ip数据库离线文件

    ### 纯真IP数据库离线文件知识点解析 #### 一、概述 纯真IP数据库离线文件是一种用于离线查询IP地址相关信息的数据库文件。它可以帮助用户在没有网络连接的情况下,快速查询到IP地址对应的地理位置等信息。相比于...

    纯真ip数据库格式详解

    纯真IP数据库格式详解 **一、纯真IP数据库概览** 纯真IP数据库是互联网上广受欢迎的IP地址查询数据库之一,以其详尽的记录和高效的查询速度著称。该数据库不仅被众多QQ外挂用于显示用户IP的功能,而且在网络安全、...

    纯真IP数据库查询系统

    "纯真IP数据库查询系统"是一个专用于查询IP地址信息的工具,主要基于"纯真IP数据库"这一数据资源。这个系统在2008年10月20日进行了数据库的更新,确保了当时的数据新鲜度和准确性,能够提供及时的IP定位服务。 在IT...

    PHP利用纯真IP数据库在本地实现IP地址信息查询(无乱码)

    2. 纯真IP数据库的使用与解析 3. PHP文件I/O操作和编码转换 4. IP地址的比较与查找 5. 数据返回与编码控制 学习这个知识点,不仅可以提升你在IP查询方面的技术能力,还能加深对PHP和网络编程的理解。

    纯真IP整理器直接提取IP数据库关键字为纯真数据

    纯真IP整理器是一款专为处理IP数据库设计的工具,主要功能是提取并整理IP数据库中的关键信息,将其转化为便于使用的纯真IP数据格式。在IT行业中,IP数据库通常用于网络定位、网络管理以及网络安全等方面,而“纯真”...

    纯真IP数据库

    在纯真IP数据库中,IP段被用来划分不同地理区域和运营商。 3. 地理位置信息:数据库提供了IP地址对应的国家、地区、城市等地理信息,有助于了解用户来源和进行地域定向服务。 4. 运营商信息:每个IP地址通常对应一...

    IP数据库查询程序纯真IP数据库查询程序

    IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库查询程序IP数据库...

    ASP利用纯真IP数据库获取IP

    在本场景中,“ASP利用纯真IP数据库获取IP”指的是使用ASP编程技术结合纯真IP数据库来获取并解析IP地址的地理位置信息。纯真IP数据库是中国的一个广泛使用的IP地址库,它包含了全球范围内的IP地址与其对应的城市、...

    纯真ip数据库2011.8.10更新

    5. **数据库格式与应用**:纯真IP数据库通常以特定的文本格式存储,例如每行代表一个IP地址段及其对应信息。开发者可以通过编程接口(API)或直接读取文件来访问数据,集成到自己的应用程序中。 6. **网络安全与...

    纯真Ip数据库(ShowIP

    其中,“纯真IP数据库”(简称ShowIP)是一款广泛使用的IP地址数据库,它包含了全球范围内的IP地址与地理位置信息,为企业和个人提供了快速查询和解析IP地址的能力。 一、IP数据库基础 IP数据库是存储了大量IP地址...

    纯真ip数据库的mysql文件

    纯真IP数据库是一种广泛使用的IP地址数据库,主要包含中国大陆及部分国际地区的IP地址与地理位置信息。这个MySQL文件是用于在服务器上存储和管理这些数据的,以便网站或应用程序能够快速查询到特定IP地址对应的地区...

    asp调用纯真ip数据库

    纯真IP数据库是收集并整理了全球范围内的IP地址与对应地理信息的数据集合,它通常以文本文件的形式存在,便于各种编程语言调用。 首先,我们需要了解如何在ASP中读取文件。ASP提供了`&lt;% %&gt;`的脚本块和内置对象如`...

    纯真ip数据库,utf-8

    总的来说,纯真IP数据库提供了方便的IP地址与地理信息的映射,对于开发和运维人员而言,正确处理其文件格式和编码,能够有效提高工作效率并保证数据的准确性。在使用时,应注意文件的编码设置,选择合适的工具和方法...

    纯真IP数据库_java版

    标题中的“纯真IP数据库_java版”指的是一个专门用于Java平台的IP地址查询工具,它基于纯真IP数据库。纯真IP数据库是中国较常见的IP地址库,包含了中国大陆及部分国际地区的IP地址信息,用于查询IP地址所属的地区、...

    ASP利用纯真IP数据库获取IP地理位置

    首先,"纯真IP数据库"是一个广泛使用的IP地址库,包含了全球IP地址与地理位置的对应关系。它是由中国的“纯真”团队维护,提供了IP到国家、地区、城市等多级地理信息的映射。这个数据库定期更新,以确保信息的准确性...

    qqwry.dat纯真ip数据库和自动更新脚本

    纯真IP数据库文件,dat数据非exe安装包,每天会扫描两次(17:55和23:55),当发现更新时也可以选择手动运行来获得文件。 目录说明 1、qqwry.dat 为最新数据直链(即下即用),每次更新会覆盖之前的内容,如果想要...

    纯真ip数据库MySQL版

    sunwe(云飞扬)转制 1,数据来源于QQip数据库纯真版. 2,本数据包包含全面,包括...3,另外,本数据包另附转化好的 纯真ip数据文本文件.(已经经过空格批量替换和插入间隔符',' 这样可以方便直接导入其他类型的数据库)

    纯真IP数据库MySQL版

    纯真IP数据库主要包含全国乃至全球的IP地址与地理位置信息,如城市、省份、运营商等。它通过定期更新,确保信息的准确性和时效性。对于需要进行IP定位、访问控制或者流量分析的应用来说,纯真IP数据库是不可或缺的...

Global site tag (gtag.js) - Google Analytics