IP与国家对应关系
2016-09-09 12:09
323 查看
到这个地址下载
https://db-ip.com/db/download/country
#代码
https://github.com/zengzhan/qqzeng-ip
#代码2,别人的
项目需要,要获得客户访问的国家。数据库用的是 http://software77.net/geo-ip/ 的数据库。这个数据库比较简单,免费,能够根据ipv4转换成国家,但是详细的地区没有。但是对于需求来说够了。
下载之后,去掉注释的部分和双引号,保存成.csv。
改好的在http://www.kuaipan.cn/file/id_107671437086556161.htm下载
代码如下。
[java] view
plain copy
public class IPtoCountry {
private static final Logger logger = LoggerFactory.getLogger(IPtoCountry.class);
private static final String UNKNOWN = "Unknown";
private static TreeMap<Long, String> map = new TreeMap<Long, String>();
/////需要先调用一次,来初始化
public static void initialize() throws Exception {
logger.info("Start to read ip-to-country data");
try {
/// 读入,可以用其他方法读入, 比如FileInputStream
/// 这里用的是class.getResourceAsStream
InputStream in = ConnectionManager.class.getResourceAsStream("/db/IpToCountry.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String s = br.readLine();
while (s != null) {
insert(s);
s = br.readLine();
}
} catch (Exception e) {
logger.error("read iptocountry", e);
logger.error("Cannot read iptocontry db/IpToCountry.csv from " + System.getProperty("user.dir"));
}
logger.info("End to read ip-to-country data. " + map.size() + " records read.");
}
/////将从数据库文件读出来的记录,插入一个TreeMap中。使用TreeMap是因为很方便查找
private static void insert(String s) {
String[] items = s.split(",");
if (items.length != 7) {
System.err.println(s);
return;
}
try {
///结束的ip
String end = items[1];
///国家
String country = items[6];
map.put(Long.valueOf(end), country);
} catch(Exception e) {
logger.error("Exception", e);
}
}
///// 根据ip转换成的long,在数据库中查找这个long坐落在那个区间范围内。
///// 如果找到了,返回国家。否则返回unknown
public static String get(long longIP) {
///这里用了ceilingEntry方法,得到TreeMap中的比所给定ip大的最小的项,该项即为所求
Entry<Long, String> e = map.ceilingEntry(longIP);
if (e == null) {
return UNKNOWN;
}
return e.getValue();
}
///// 按照ip数据库中注释的说明,将4位的ip转换成一个long
public static long getDeviceIPAsLong(String deviceIP) {
[java] view
plain copy
if (deviceIP == null || deviceIP.isEmpty()) {
return -1;
}
try {
String[] digits = deviceIP.split("\\.");
if (digits.length != 4) {
return -1;
}
long l3 = Long.parseLong(digits[3]);
long l2 = Long.parseLong(digits[2]);
long l1 = Long.parseLong(digits[1]);
long l0 = Long.parseLong(digits[0]);
return l3 + 256 * l2 + 256 * 256 * l1 + 256 * 256 * 256 * l0;
} catch(Exception e) {
return -1;
}
}
public static String get(String deviceip) {
long l = getDeviceIPAsLong(deviceip);
if (l == -1) {
return UNKNOWN;
}
return get(l);
}
}
https://db-ip.com/db/download/country
#代码
https://github.com/zengzhan/qqzeng-ip
#代码2,别人的
项目需要,要获得客户访问的国家。数据库用的是 http://software77.net/geo-ip/ 的数据库。这个数据库比较简单,免费,能够根据ipv4转换成国家,但是详细的地区没有。但是对于需求来说够了。
下载之后,去掉注释的部分和双引号,保存成.csv。
改好的在http://www.kuaipan.cn/file/id_107671437086556161.htm下载
代码如下。
[java] view
plain copy
public class IPtoCountry {
private static final Logger logger = LoggerFactory.getLogger(IPtoCountry.class);
private static final String UNKNOWN = "Unknown";
private static TreeMap<Long, String> map = new TreeMap<Long, String>();
/////需要先调用一次,来初始化
public static void initialize() throws Exception {
logger.info("Start to read ip-to-country data");
try {
/// 读入,可以用其他方法读入, 比如FileInputStream
/// 这里用的是class.getResourceAsStream
InputStream in = ConnectionManager.class.getResourceAsStream("/db/IpToCountry.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String s = br.readLine();
while (s != null) {
insert(s);
s = br.readLine();
}
} catch (Exception e) {
logger.error("read iptocountry", e);
logger.error("Cannot read iptocontry db/IpToCountry.csv from " + System.getProperty("user.dir"));
}
logger.info("End to read ip-to-country data. " + map.size() + " records read.");
}
/////将从数据库文件读出来的记录,插入一个TreeMap中。使用TreeMap是因为很方便查找
private static void insert(String s) {
String[] items = s.split(",");
if (items.length != 7) {
System.err.println(s);
return;
}
try {
///结束的ip
String end = items[1];
///国家
String country = items[6];
map.put(Long.valueOf(end), country);
} catch(Exception e) {
logger.error("Exception", e);
}
}
///// 根据ip转换成的long,在数据库中查找这个long坐落在那个区间范围内。
///// 如果找到了,返回国家。否则返回unknown
public static String get(long longIP) {
///这里用了ceilingEntry方法,得到TreeMap中的比所给定ip大的最小的项,该项即为所求
Entry<Long, String> e = map.ceilingEntry(longIP);
if (e == null) {
return UNKNOWN;
}
return e.getValue();
}
///// 按照ip数据库中注释的说明,将4位的ip转换成一个long
public static long getDeviceIPAsLong(String deviceIP) {
[java] view
plain copy
if (deviceIP == null || deviceIP.isEmpty()) {
return -1;
}
try {
String[] digits = deviceIP.split("\\.");
if (digits.length != 4) {
return -1;
}
long l3 = Long.parseLong(digits[3]);
long l2 = Long.parseLong(digits[2]);
long l1 = Long.parseLong(digits[1]);
long l0 = Long.parseLong(digits[0]);
return l3 + 256 * l2 + 256 * 256 * l1 + 256 * 256 * 256 * l0;
} catch(Exception e) {
return -1;
}
}
public static String get(String deviceip) {
long l = getDeviceIPAsLong(deviceip);
if (l == -1) {
return UNKNOWN;
}
return get(l);
}
}
相关文章推荐
- CISCO交换机端口、IP与MAC对应关系
- 局域网里取得ip和mac的对应关系
- 如何在本地配置域名和ip对应关系
- TCP/IP四层参考模型和OSI七层参考模型对应关系
- TCP/IP模型及与OSI参考模型的对应关系
- 组播IP与组播Mac的对应关系
- 如何在本地配置域名和ip对应关系
- 域名 IP 对应关系
- Linux 域名和ip 的对应关系写定
- IP---域名对应关系
- shell 实现统计一个网段的IP和mac对应关系并保存到文件mac.txt
- 查询域名与对应ip的关系
- 语言及对应的国家关系清单
- 国家计算机技术与软件专业技术资格(水平)考试与职称有何对应关系?
- 更新交换机的ip与mac的对应关系
- iso/osi7层模型与TCP/IP四层模型对应关系
- 国家与大洲对应关系json数据
- session和ip的对应关系
- 通过新浪IP服务器获得的当前客户端IP地址对应的国家、省份或直辖市、城市信息
- Sql类型与.Net(C#)类型对应关系表