根据ip获取城市名称等信息

根据ip获取所在的城市名称及其他的一些相关信息,感觉挺有用的,就记录一下

项目所需要的QQWry.Dat文件及handsome-ipaddress-bin.jar包 上百度云下载  链接:http://pan.baidu.com/s/1hsfnrKS

应用QQWry.Dat文件的好处在于不用依赖第三,挺方便的
科普
QQWry.Dat 实现 IP 地址高效检索(PHP),当时是直接从文件里查询的,虽然在创建类的一个实例后,可以进行多次查询,不用每次查询都打开文件,已经很快了,但是我想也许还可以更快点儿,于是我想到了用共享内存。下面这个程序就是我用共享内存来实现的快速查询类,它在第一个实
一个利用 QQWry.Dat 实现 IP 地址高效检索(PHP),当时是直接从文件里查询的,虽然在创建类的一个实例后,可以进行多次查询,不用每次查询都打开文件,已经很快了,但是我想也许还可以更快点儿,于是我想到了用共享内存。下面这个程序就是我用共享内存来实现的快速查询类,它在第一个实例被创建时将 QQWry.Dat 文件读入共享内存,以后每次查询都直接从共享内存中查找数据,而不需要再读文件了,现在的查询效率是原来的 1.5 倍。不过使用这个类要注意一点,这个类是一个 Singleton 类,所以需要用 & IpLocation::getInstance 来返回此类的实例引用,而不要用 new IpLocation 来创建实例,不然就不能保证实例的唯一性了。如果在一个页面内创建多个 IpLocation 实例的话,你会得到内存错误,严重情况下可能会使你的服务器崩溃,因此我才把它定义为一个 Singleton 类。另外这个类的实例被创建一次后,文件内容就被读入到共享内存中了,因此如果服务器不重新启动,内存中的 QQWry.Dat 的文件数据就不会更新。

下面直接上代码
package src.*****;

package src.****;

import com.handsome.ip.IPSeeker;

/**
* Created by Administrator on 2016/9/8.
*/
public class IPUtils {
private static IPUtils ipUtils;
private IPSeeker ipSeeker;

public IPUtils() {
String path = this.getClass().getClassLoader().getResource("QQWry.Dat").getPath();
path = path.substring(0,path.lastIndexOf("/")+1 );
ipSeeker = new IPSeeker("QQWry.Dat",path);
}

public static IPUtils getIpUtils(){
if(ipUtils==null){
ipUtils = new IPUtils();
}
return ipUtils;
}
public String getAddress(String ip){
String address = ipSeeker.getIPLocation(ip).getCountry()+ipSeeker.getIPLocation(ip).getArea();
return address;
}

public static void main(String[] args) {
System.out.println(IPUtils.getIpUtils().getAddress("218.95.229.250"));
}
}

2016-09-08
posted @ 2016-09-08 15:55  雷诺2016  阅读(644)  评论(0编辑  收藏  举报