文档章节

自己维护一个简单的ip库

止静
 止静
发布于 2014/09/16 09:58
字数 1431
阅读 754
收藏 6


阅读前提: 

            在阅读之前,请参考知乎上对ip库的一个简要讨论:

             http://www.zhihu.com/question/19584593


阅读目的:一步一步建立ip库,目前采用的是纯真IP库,纯真ip库是一个民间收集的ip库:

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


1 : 下载地址:

        我的下载地址为:http://www.pc6.com/softview/SoftView_41490.html

         一旦失效,请自行baidu.

2 :   下载以后是是一个纯真的Exe文件,点击安装,没关系。纯真已经封装为Exe APP 方便使用了。

3 : 安装后,启动界面如下,请点击导出按钮:

    


 3:导出的文件,在本博文之中,将命名为IpBase


 4 : 原始的数据格式如下:

 起始                 结束                   位置

1.57.23.0       1.57.31.255     黑龙江省绥化市 联通

1.57.32.0       1.57.32.255     黑龙江省绥化市望奎县 联通

1.57.33.0       1.57.33.255     黑龙江省绥化市 联通

1.57.34.0       1.57.34.255     黑龙江省绥化市肇东市 联通


通常在应用程序之中,需要将ip转换为一个long 类型的值,并且将地理位置分为多级:

 实例如下:

    465645664,44655468,黑龙江省,绥化市

 由于具体的区县,目前数据采集还不够完善。所以我们只是简单的区两级地理位置:

  

   以下是一个我写的转换代码:比较繁琐。将 省份,区域,

package com.mixbox.parser.IPBaseTransfer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import com.coreJava.ipAndLong.IpAndLongTransfer;

public class cz_fileTofile {

	public static final String _filePath = "E:\\ipBase.txt";
	public static final String _outPath = "E:\\ipBase_new2.txt";
	public static final String _blank = " ";
	public static BufferedReader _bufferedReader;
	public static BufferedWriter _bufferedWriter;
	public static String _comma = ",";

	public static void main(String[] args) throws IOException {
		_bufferedReader = new BufferedReader(new InputStreamReader(
				new FileInputStream(_filePath), "GBK"));
		_bufferedWriter = new BufferedWriter(new OutputStreamWriter(
				new FileOutputStream(_outPath), "GBK"));

		String str = null;

		while ((str = _bufferedReader.readLine()) != null) {

			try {

				pn("--------------------------- start");
				String onebank = str.replaceAll("\\s{1,}", " ");
				pn(onebank);

				String[] records = onebank.split(_blank);

				if (records.length < 3) {
					System.err.println(onebank);
					System.exit(1);
				}

				String location = records[2];
				pn(location);

				// 我们把location直接解析成 省份,城市,和地区
				String province = null;
				String city = null;
				String area = null;

				// 针对有省份的进行修改
				province = getProvince(location);
				city = getCity(location);

				pn("修改后的省:" + province);
				pn("修改后的城市:" + city);

				long begin_ip = IpAndLongTransfer.ipToLong(records[0]);
				long end_ip = IpAndLongTransfer.ipToLong(records[1]);

				pn("开始ip" + begin_ip);
				pn("结束ip" + end_ip);

				StringBuffer sb = new StringBuffer();
				sb.append(begin_ip).append(_comma).append(end_ip)
						.append(_comma).append(province).append(_comma)
						.append(city);

				String writerString = sb.toString();
				_bufferedWriter.write(writerString);
				_bufferedWriter.newLine();

				pn("--------------------------- end \n");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	// 从location之中得到我们的城市
	private static String getCity(String location) {
		String returnCity = "无法确定";

		// 当前的字符串是某省某市的格式,省下面可能是市,也可能是区,比如说:黑龙江省大兴安岭地区
		if (location.contains("省")) {

			// 如果有区,那么先截取到区
			// 3683905536,3683905631,黑龙江,大兴安岭地区
			// 3683902117,3683902141,黑龙江,伊春市伊春区
			//
			if (location.contains("区")) {
				int num_province = location.indexOf("省");
				int num_city = location.indexOf("区");
				returnCity = location.substring(num_province + 1, num_city + 1);

			}

			// 比如 大兴安领区是不包括市,所有returncity不变
			// 如果是 伊春市伊春区,那么截取的就是 伊春市
			if (location.contains("市")) {

				int num_province = location.indexOf("省");
				int num_city = location.indexOf("市");
				returnCity = location.substring(num_province + 1, num_city + 1);

			}
		}

		if (location.contains("北京") || location.contains("上海")
				|| location.contains("重庆") || location.contains("天津")) {

			int length = location.length();

			// 其中的信息只包含了 北京市,上海市,重庆市,天津市等
			if (location.length() == 3) {

				// 其中的信息包含了北京市以外的其他区县
			} else if (length > 3) {
				int num_split = location.indexOf("市") + 1;
				returnCity = location.substring(num_split);
			}
		}

		if (location.contains("西藏") || location.contains("新疆")
				|| location.contains("广西") || location.contains("宁夏")
				|| location.contains("内蒙")) {

			int firstSplitPoint = 0;
			int endSplitPoint = location.length();

			// 内蒙占位为3,在原始数据之中是内蒙古,而不是内蒙古自治区
			if (location.contains("内蒙")) {
				firstSplitPoint = 3;

				// 如果整个的位置为“内蒙古",那么就无法确定内蒙古下面到底是哪一个城市
				if (location.equals("内蒙古")) {
					returnCity = "无法确定";
				}

				int num_city = location.indexOf("市");
				returnCity = location.substring(firstSplitPoint, num_city + 1);

				// 其他的几个自制区为2
			} else {
				firstSplitPoint = 2;

				if (location.equals("西藏") || location.equals("新疆")
						|| location.equals("广西") || location.equals("宁夏")) {

					returnCity = "无法确定";
				}

				int num_city = location.indexOf("市");
				returnCity = location.substring(firstSplitPoint, num_city + 1);
			}
		}

		// 特别行政区
		if (location.contains("香港")) {
			returnCity = "香港";
		}
		if (location.contains("澳门")) {
			returnCity = "澳门";
		}

		return returnCity;
	}

	private static String getProvince(String location) {
		String returnProvince = "无法确定";

		// 省
		if (location.contains("省")) {
			if (location.equals("黑龙江省")) {
				returnProvince = "黑龙江省";
			} else {
				returnProvince = location.substring(0, 3);
			}
		}

		// 自治区
		if (location.contains("西藏")) {
			returnProvince = "西藏自治区  ";
		}

		if (location.contains("新疆")) {
			returnProvince = "新疆维吾尔自治区 ";
		}

		if (location.contains("广西")) {
			returnProvince = " 广西壮族自治区 ";
		}

		if (location.contains("宁夏")) {
			returnProvince = "宁夏回族自治区 ";
		}

		if (location.contains("内蒙古")) {
			returnProvince = "内蒙古自治区";
		}

		// 直辖市
		if (location.contains("北京")) {
			returnProvince = "北京市";
		}

		if (location.contains("上海")) {
			returnProvince = "上海市";
		}

		if (location.contains("天津")) {
			returnProvince = "天津市";
		}
		if (location.contains("重庆")) {
			returnProvince = "重庆市";
		}

		// 特别行政区
		if (location.contains("香港")) {
			returnProvince = "香港特别行政区";
		}

		if (location.contains("澳门")) {
			returnProvince = "澳门特别行政区";
		}

		return returnProvince;
	}

	private static void isBkank(String[] records, int i) {
		if (records[i] != _blank) {
			p(records[i]);
		}
	}

	public static void pn(Object o) {
		System.out.println(o.toString());
	}

	public static void p(Object o) {
		System.out.print(o.toString());
	}

}


  作为一个参考:请自行再做修改~  

            Simple Tips。


    转换后的结果如下所示:

    long               long          省份    城市

3658172295,3658172295,河北省,保定市

3658172296,3658172333,河北省,保定市

3658172334,3658172334,河北省,保定市

3658172335,3658172402,河北省,保定市

3658172403,3658172403,河北省,保定市

3658172404,3658172415,河北省,保定市

3658172416,3658172671,河北省,秦皇岛市

3658172672,3658172927,河北省,秦皇岛市

3658172928,3658175487,河北省,秦皇岛市

3658175488,3658176879,河北省,廊坊市

3658176880,3658176880,河北省,廊坊市

3658176881,3658176904,河北省,廊坊市

3658176905,3658176905,河北省,廊坊市

3658176906,3658176998,河北省,廊坊市

3658176999,3658176999,河北省,廊坊市

3658177000,3658177020,河北省,廊坊市

3658177021,3658177021,河北省,廊坊市

3658177022,3658177642,河北省,廊坊市

3658177643,3658177643,河北省,廊坊市

3658177644,3658177681,河北省,廊坊市

3658177682,3658177682,河北省,廊坊市


© 著作权归作者所有

止静
粉丝 121
博文 134
码字总数 125762
作品 0
东城
技术主管
私信 提问
基于Golang的IP地址信息查询服务

https://github.com/miraclesu/ipip 工作中经常会有通过IP匹配用户信息的需求,如确定用户所在的地区(国家/省份/城市)、运营商、时区、经纬度等等。前一阵有个Golang开发的项目也有这样的需...

mickelfeng
2017/11/22
106
0
数据库的读写分离

转:http://www.cnblogs.com/qlee/archive/2011/04/08/2009738.html 随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果...

商者
2016/05/24
131
0
linux内核项目外包

基于ip的包过滤,动态维护一个ip库的白名单(10万量级),对外提供http接口初始化、添加、删除、清空白名单 从一块网卡进来的流量,不在这个白名单里的都丢弃 在白名单的直接通过另一个网卡发...

无言度
2013/11/15
209
0
虚拟IP和IP漂移

原文:http://xiaobaoqiu.github.io/blog/2015/04/02/xu-ni-iphe-ippiao-yi/ 学习一下虚拟IP和IP漂移的概念。 1.虚拟IP 在 TCP/IP 的架构下,所有想上网的电脑,不论是用何种方式连上网路,都...

樂天
2015/12/05
3.4K
0
简单写一写keepalived

一、keepalived简介: 1、什么是keepalived? keepalived起初是为lvs设计的而保证集群高可用的一个服务软件,用来检测服务器的状态以及loadbbalance主机和backup主机之间的failover(故障切换...

攻城狮赵峰
2017/06/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
24分钟前
4
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
25分钟前
3
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
27分钟前
6
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
31分钟前
3
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部