纯真ip数据库与全国行政区域规划关联

标签: ip 数据库 行政区域 | 发表时间:2015-01-10 20:13 | 作者:crackajack_zg
出处:http://www.iteye.com
想实现一个功能:根据用户在公网上的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库。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [ip 数据库 行政区域] 推荐:

纯真ip数据库与全国行政区域规划关联

- - Java - 编程语言 - ITeye博客
想实现一个功能:根据用户在公网上的ip地址对应到该用户所在的行政区划,精确到县. 这个功能能不能实现的关键还是在能不能找到一个数据较为完善的ip地址库. 在网上找了一下,还是觉得纯真ip数据库好用. 1 下载纯真ip数据库,然后解压成文件导入自己建的数据库(见附件). 2 下载全国省市县行政规划(见附件).

IP地理位置数据库 中国地区扩展版 120621

- - eMule Fans 电骡爱好者
这里的 IP地理位置数据库 中国地区扩展版,是 我们在webhosting.info的数据库基础上,进行了简体中文的汉化,并将 QQ IP 数据库(QQWry.Dat)纯真版中的中国地区详细IP数据库导入,而结合得到的. 更新时间2012年6月21日,版本号120621. IP to Country 数据库文件ip-to-country.csv,可用于Xtreme、MorphXT等许多支持IP2C功能的 eMule Mod软件.

IP地理位置数据库 世界城镇扩展版 130812

- - eMule Fans 电骡爱好者
这里的 IP地理位置数据库世界城镇扩展版是MaxMind(也就是 IP地理中英文版)制作的 GeoLite City 地理位置世界城镇扩展版本, 我们将其转换整理为eMule可用的格式. IP to Country 数据库文件ip-to-country.csv,可用于Xtreme、MorphXT等许多支持IP2C功能的 eMule Mod软件.

来自17MON的IP归属地数据库

- - 标点符
IP数据是互联网上一个非常基础的数据,无论是数据统计、广告投放还是CDN解析等,效果都与IP数据库有非常直接的关系. 虽然IP数据非常的重要,但是市场上大部分的数据都是存在很多的问题,百度、阿里、腾讯在这方面做得很好,但是他们的数据并不提供外部下载,淘宝上兜售的IP数据库也不见得好到那里去,且没有更新机制.

JS获取Ip和浏览器信息,用户逗留时间写进数据库

- - ITeye博客
data: "{IP:'" + IP + "',city:'" + city + "',fromURL:'" + fromURL + "',Browse:'" + Browse + "',time:'" + time + "'}",. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

tcp/ip调优

- Lucseeker - 在路上
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;.

获取 WAN IP

- 狗尾草 - LinuxTOY
如果你在 router 或者 firewall 后面,你直接查询 interface ,拿到可能不是 WAN 的 IP. 很久很久以前的一个版本,把它们贴到 .bashrc (Bash 专用) 或者 .profile (非 Bash 专用)里面去. .profile 即可生效,输入 myip 就能拿到 WAN IP.

TCP/IP分享——链路层

- Goingmm - 弯曲评论
在张国荣自尽8周年纪念日,也就是愚人节的前几十分钟,终于把第二章弄完了. 首席似乎不是特别有空,我就斗胆在这里自己发了,从前面2期的反响来看,相当热烈,我也是摆出一副要杀要剐,悉听尊便的架势,这可能是受最近流行霸气外露的影响,批评几句又伤不了皮毛,也影响不了我的工作和正常生活,只要给大家带来快乐,我就很开心,似乎历史上很多想法都是在争吵中诞生的.

一些IP查询网站

- 19GHz - iGFW
一些境内服务器的IP查询网站:. 一些境外服务器的IP查询网站:. https://whoer.net/ (支持https). 各网站查询到的IP归属地可能有差异,以apnic.net为准. 本文原始地址:http://igfw.tk/archives/5611.

TCP/IP重传超时--RTO

- dennis - 一个故事@MySQL DBA
Shared by 子非鱼 安知余(褚霸). 概述:本文讨论主机在发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久后会重传这个数据包. 主机从发出数据包到第一次TCP重传开始,RFC中这段时间间隔称为retransmission timeout,缩写做RTO. 本文会先看看RFC中如何定义RTO,然后看看Linux中如何实现.