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

Java实现的IP地址查询 - 性能不逊色于C

    博客分类:
  • java
阅读更多

看到很多网站提供IP地址查询的服务,当时就想如此庞大的IP数据库,如何做才能做到适合互联网的高并发呢?

 

后来在网上突然发现了有些网友发布的全球IP数据库包,下下来也不大,文本文件有10多M,大约有36W+数据,然后看了看文件的格式,就想把他导入数据库看看,然后利用数据库简单的查了查我们所在地的IP地址信息是否准确,效率还挺高,0.00s就出结果了,然后我就用随机生成ip地址的方式进行测试,发现每秒也就查询200~500次,这个时候MySQL符合已经很重。这样肯定不行啊,对于大量的互联网请求根本无法满足,如果是集群对于这种小的程序又没有必要。

 

然后就又想到了文件,然后利用找到的原始文件,然后对里面的格式进行了调整,准备使用Java的RandomAccessFile对文件直接查找,由于IP地址信息是按照顺序进行排序的,所以我把所有的ip转换成了int类型,然后利用二分法进行查找

public String search(String ip) {
        RandomAccessFile raf  = new RandomAccessFile("E:/aa/city/ips.txt", "r");
        long seek = IPConvert.IP2Long(ip);
        int index = 0;
        int start = 0;
        int end = 25133;
        String address = null;
        IpA ipa;

        while (true) {
            try {
                index = start + ((end - start) / 2);
                raf.position(index * 56);

                ipa = new IpA();
                ipa.setFromip(readFromip(mbb));
                ipa.setToip(readToip(mbb));

                if (ipa.getFromip() <= seek && ipa.getToip() >= seek) {
                    address = readAddress(mbb);
                    break;
                } else if (ipa.getFromip() > seek && start != index) {
                    end = index;
                } else if (ipa.getToip() < seek) {
                    start = index + 1;
                    if(start >= 25133) {
                        address = "不存在该ip地址";
                        break;
                    }
                } else {
                    address = "不存在该ip地址";
                    break;
                }

            } catch (IOException ex) {
                Logger.getLogger(FileDB.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return address;
    }
 

这样利用随机生成的ip地址串进行测试,发现速度有了明细的提升,查询的次数可以达到2000+,其实这个时候自己还是挺高兴的,毕竟发现速度提升了很多,但是后来在网上发现,有人利用C语言写的查找IP地址的算法,每秒的查询次数可以达到10000+,当时心里一下就感觉到,跟他们的差距这么大,人家用一台计算机完成的工作,我至少要用5台。。

 

所以我只能在去寻找更好的办法,如果再想提升性能,现在已经使用二分法了,已经基本上是最快的搜索算法,肯定不能通过这个突破了,然后就想到了内存,将数据放到内存中,岂不可以极大的提高查询的速度。而且IP数据库的数据量也不是太大,最多10M+,那也占用不了多少内存,然后我就尝试着将这个ip的文本文件映射到内存中,使用的同样是二分法查找,这一次,在我用随机生成的ip地址测试时,竟然达到了10W+,哈哈,终于达到他们的水平,也说明java的性能也不必C差多少啊,完全可以满足我们的需求了,java好东西啊。。。当然他们那时候用的计算机性能可能没有我的性能好,但是这样的结果我已经比较满意了,起码可以和他们的相当了。

 

当然我的IP文件还有一些可以优化的地方,但是到这里可以先告一段落了,优化无止境。。。。。。

 

结束!

4
0
分享到:
评论
10 楼 iblike 2014-03-04  
给我发一份,谢谢哦,iblike@163.com
9 楼 编程的石头 2014-02-25  
还可以再优化,你把地址库作一个分段,如1.1.1.1~63.1.1.1作为一段,63.1.1.1~127.1.1.1,要查询时,把IP地址的第一位X/64,直接判断地址库,然后去里面找就可以了。这样效率要快一些。

还有一种方法,既然都已经全部在数据库里面了,而且IP也是可以转化为数字的,为何不直接用数组呢,IP地址的2进制转为10进制,然后作为index放数据库,要使用的时候直接去访问就可以了,这样效率更高。
8 楼 hwhwl 2013-06-04  
给我也发一下吧 hwhwl@jpw.cn 我也需要这个
7 楼 gotosuzhou 2012-12-04  
给我也发下   785461216@qq.com
6 楼 le_kj 2012-10-19  
你好!最近想买刚好有这需求,不知道这一段的源码能否分享下,多谢了。这是我邮箱454793756@qq.com
5 楼 liujava 2012-09-10  
你好,我现在正在忙这样一个需求,您是否能发一份这样的源码给我,我的邮箱是xinliuzhen@163.com
4 楼 Joyuan300 2012-07-27  
不知道这一段的源码能否提供一下呢,多谢了,可以的话发qianzhaoyuan@qq.com
3 楼 hupy 2010-12-24  
changyuxin 写道
25133这个数据怎么算出来的

我选用的IP库,有 25133个 IP段
2 楼 changyuxin 2010-12-21  
25133这个数据怎么算出来的
1 楼 dukai1008 2010-08-09  
不错,呵呵

相关推荐

    Java 实现ip 地址排序

    Java ip 地址排序Java ip 地址排序Java ip 地址排序Java ip 地址排序

    java实现根据ip地址获取地理位置的代码分享

    本篇文章将分享一个利用Java实现根据IP地址获取地理位置的简单示例,主要使用了QQ在线接口,同时提到了其他如新浪、淘宝等提供的接口作为替代选项。 首先,我们来看一下核心的Java代码。这段代码定义了一个`...

    Java实现IPV6地址查询

    在Java编程环境中,实现IPv6地址查询涉及到网络编程和数据库操作。IPv6是互联网协议的第六版,相较于IPv4提供了更大的地址空间,以应对互联网设备数量的急剧增长。本项目利用ZX公网IPv6库(版本20120916)来执行IPv6...

    java IP地址工具类,java IP地址获取,java获取客户端IP地址

    在Java编程中,获取IP地址是...总之,`IpUtils`是一个方便的Java工具类,它简化了IP地址的处理,使得开发者可以更专注于业务逻辑而不是网络底层的细节。通过深入学习和使用这个类,可以提高我们处理IP相关问题的效率。

    ip查询归属地收藏 Java 查询IP地址

    根据给定的文件信息,我们可以总结出以下关于“IP查询归属地”以及使用Java进行IP地址查询的关键知识点: ### IP地址基础知识 IP地址是互联网协议(Internet Protocol)地址的简称,用于唯一标识网络上的设备。它由...

    ip2location-lite-db1.csv.zip ip国家对应 数据库 ipv4版本

    在实际应用中,开发者可以通过编程语言(如Python、Java等)读取这个CSV文件,根据IP地址查询相应的国家信息。这在网站统计、广告定向、内容过滤等领域都有广泛应用。同时,由于是轻量级版本,可能只包含部分国家或...

    JAVA IP地址查询地理位置

    通过IP地址查询所在省市,基于qqwry.dat(可通过百度下载最新qqwry.dat文件来更新)。 代码已经简化过,直接调用静态方法即可返回地区信息(传入IP为参数)。 使用时只需要把唯一工具类:IpLocationTool.java(无...

    ip地址管理器用java语言实现

    本项目名为“IP地址管理器”,采用Java语言进行实现,主要关注于IP地址的过滤、开通和关闭功能。这涉及到网络编程、数据结构、多线程以及可能的数据库操作等多个知识点。 首先,我们需要理解IP地址的基本概念。IP...

    java IP地址网段计算的示例代码

    在Java语言中,可以使用各种算法和技巧来实现IP地址网段计算。下面是一个示例代码,展示了如何使用Java语言计算IP地址网段。 知识点1:IP地址网段计算的基本概念 IP地址网段计算的基本概念是使用子网掩码来计算出...

    纯JAVA实现修改本地IP(swing界面版)

    总结起来,"纯JAVA实现修改本地IP(swing界面版)"项目涉及到了Java编程、Swing GUI设计、IP地址处理、文件I/O、事件处理、多线程以及错误处理等多个核心知识点。通过这个项目,开发者不仅可以提升Java编程技能,也能...

    根据IP地址获取经纬度

    标题中的“根据IP地址获取经纬度”是指在Java编程环境下,通过特定的库或API来实现从IP地址解析出地理位置的经纬度坐标。这通常涉及到网络编程和地理信息系统(GIS)的技术。描述中提到的Java工程是实现这个功能的一...

    java获取ip地址

    ### Java获取IP地址知识点解析 在本篇文章中,我们将深入探讨如何使用Java语言来获取IP地址。这是一项在网络编程中非常基础且重要的技能,能够帮助开发者了解客户端或服务器的网络位置信息。以下是对给定文件中的...

    java根据ip获取国家、地区名称,附带ip地址库

    总结来说,Java中根据IP获取国家和地区名称涉及的技术点包括:使用`InetAddress`处理IP地址、理解IP地址库的结构和查询机制、以及选择和使用合适的第三方库或服务进行IP定位。在实际应用中,应确保IP库的及时更新,...

    java根据Ip地址获取归属地

    根据Ip地址获取归属地,需要用到ip库,我这里用到的是QQWry.dat

    简易java查询IP归属地示例代码

    简易java查询IP归属地示例代码。 面向中国大陆地区的 手机号码、电话号码、IP地址 归属地查询库。 IP地址库来源于 [ip2region](http://git.oschina.net/lionsoul/ip2region)。 手机号码段和电话号码区号信息来源于 ...

    java 获取 IP 地址

    在Java编程语言中,获取IP地址是一项常见的任务,特别是在网络编程和服务器开发中。这个程序虽然界面简单,但核心功能强大,它能够帮助开发者获取指定域名对应的IP地址。以下是关于这个话题的一些详细知识点: 1. *...

    Java获取ip所在地区

    在IT行业中,网络编程是不可或缺的一部分,而与之相关的任务之一就是识别和处理IP地址。在Java编程中,我们有时需要获取一个IP地址所对应的具体地理位置,例如省份、城市等信息。这通常需要借助特定的IP数据库,如...

    java开发-IP解析方案-最新GeoIP2与IP2LOCATIO与dbIP离线数据库文件

    这些数据库提供了高效且准确的IP地址到地理位置的映射,使得开发者能够在不依赖在线服务的情况下进行IP地址解析。 首先,GeoIP2是由MaxMind公司提供的一个强大的IP位置数据库。它包含了全球范围内的IPv4和IPv6地址...

    java根据ip反查省市县地址

    实现IP反查地址的功能,通常会依赖于IP库或服务,如MaxMind的GeoIP数据库。GeoIP数据库包含了全球IP地址与地理位置的映射关系,包括国家、地区、城市等信息。在Java中,我们可以使用开源库如`geoip-api-java`来访问...

    java常用ip匹配

    在Java中进行IP地址匹配与验证,既可以通过编写复杂的正则表达式实现精确的模式匹配,也可以利用内置的`java.net.InetAddress`类进行更为简洁高效的处理。选择哪种方式取决于具体的应用场景和个人偏好。无论采用何种...

Global site tag (gtag.js) - Google Analytics