Echarts显示全球dns server物理位置
今天YY给了我一大串dns server的ip,然后提出将这些ip物理位置显示在世界地图上(仅仅显示每个地区有几个dns server就好),苦逼了一下午,总算告一段落。把里面关键的点贴上来以后看。。。
1、地图插件用的Echarts(http://echarts.baidu.com/)
2、解析ip的物理地址用的nodejs
先上张效果图:

dns ip文件长这个样子:
180.222.176.221
122.231.179.214
69.140.168.9
124.217.245.110
162.144.74.160
23.94.187.47
72.231.182.234
76.99.144.59
5.133.217.42
217.15.116.80
175.244.198.109
179.158.154.41
42.80.173.8
220.120.58.209
46.28.68.152
199.204.250.165
198.84.75.91
69.249.37.227
187.177.77.195
122.133.187.164
84.108.142.88
217.129.35.190
68.54.40.245
93.69.100.139
184.53.155.254
//此处省略好多好多行
ip物理地址库和示例代码请戳:http://tool.17mon.cn/ipdb.html#userconsent#
这里我选用的nodejs版本(其实Python实现起来真心简单啊。。。可作为前端狗,先把nodejs玩顺溜再说)
ip解析:ip.js(这个主要是看里面的接口。。。会用就OK,以后有空儿了可以琢磨下实现原理)
var fs = require('fs');
var dns = require('dns');
var _17monIpDbPath = './17monipdb.dat';
var loadBinaryData = function(filepath){
var fd = fs.openSync(filepath, 'r');
var indexLengthBuffer = new Buffer(4);
var chunkSize = 102400,
chunkBuffer,
chunks = [];
var readLength = 0,
bufferLength = 0;
while (true) {
chunkBuffer = new Buffer(chunkSize);
readLength = fs.readSync(fd, chunkBuffer, 0, chunkSize, bufferLength);
bufferLength += readLength;
chunks.push(chunkBuffer);
if (readLength < chunkSize) break;
}
fs.closeSync(fd);
return Buffer.concat(chunks);
};
var IpFind = function(ip){
var ipArray = ip.trim().split('.'),
ip2long = function(ip){return new Buffer(ip.trim().split('.')).readInt32BE(0)},
ipInt = ip2long(ip);
var offset = dataBuffer.readInt32BE(0);
var indexBuffer = dataBuffer.slice(4, offset - 4 + 4);
var tmp_offset = ipArray[0] * 4, max_comp_len = offset - 1028, index_offset = -1, index_length = -1, start = indexBuffer.slice(tmp_offset, tmp_offset + 4).readInt32LE(0);
for (start = start * 8 + 1024; start < max_comp_len; start += 8) {
if (indexBuffer.slice(start, start + 4).readInt32BE(0) >= ipInt) {
index_offset = ((indexBuffer[start + 6] << 16) + (indexBuffer[start + 5] << 8) + indexBuffer[start + 4]);
index_length = indexBuffer[start + 7];
break;
}
}
if (index_offset == -1 || index_length == -1) {
return [];
} else {
return dataBuffer.slice(offset + index_offset - 1024, offset + index_offset - 1024 + index_length).toString('utf-8').split("\t");
}
};
var dataBuffer = loadBinaryData(_17monIpDbPath);
exports.find = function(name, callback){
dns.resolve4(name, function (err, addresses) {
if (err) {
callback(IpFind(name));
} else {
callback(IpFind(addresses.shift()));
}
});
};
exports.findSync = IpFind;
这是网上的示例代码
逐行读取txt,使用ip.js里的函数,生成Echarts所要的数据格式:run.js
var fs = require('fs');
var IP = require('./ip');
var _dnsserver = './dnsserver.txt';
fs.readFile(_dnsserver,'utf-8',function(err,data){
var dataIp = [];
var dataArr = data.split(/\n+/);
for(var i=0 ; i < dataArr.length-1 ; i++){
dataIp.push(IP.findSync(dataArr[i])[0]);
}
var oData = countArr(dataIp);
var jsonData = [];
for(var attr in oData){
var tempObj = {};
tempObj.name = attr;
tempObj.value = oData[attr];
jsonData.push(tempObj);
}
console.log(jsonData);
//jsonData是我们要的数据格式,大体长这个样子
// [ { name: '日本', value: 55 },
// { name: '中国', value: 240 },
// { name: '美国', value: 489 }]
});
function countArr(arr){
var o = {};
for(var i = 0, l = arr.length; i < l; i++){
var key = arr[i];
if(!o[key]){
o[key] = 1;
} else {
o[key]++;
}
}
return o;
}
/* 异步方法 支持域名 */
//IP.find('116.226.54.188', function(data){
// console.log(data);
//});
/* 同步方法,不支持域名,仅支持IPv4 */
//console.log(IP.findSync('180.73.134.23'));
运行run.js,结果如下:

然后生成txt,把结果存起来,用jQuery Ajax读取,这时,坑爹的bug来了。。。
先看代码:
$(document).ready(function(){
$.ajax({
type: "get",
url: 'data.txt',//本地存的文件
dataType: 'text',
success: function(data) {
alert(data);//这个data就是文件内容了
}
});
});
感觉没任何错误吧。。。IE低下也能粗结果,可是chrome里data就是没值啊没值。。。后来各种查资料才知道,chrome Ajax不能访问本地文件 (http://blog.csdn.net/spring21st/article/details/6109669),之前都是访问的server上的数据,没访问过本地的文件,没遇到过,这回真心长姿势了。。。
最后Echarts使用真心没啥好贴,不过注意下那个版本问题,有时候会粗错
Echarts显示全球dns server物理位置的更多相关文章
- 软件架构自学笔记-- 转载“虎牙在全球 DNS 秒级生效上的实践”
虎牙在全球 DNS 秒级生效上的实践 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下 5 各部分: 背景介绍: 方案设计和对比: 高可用: 具体实践和落地: ...
- 虎牙在全球 DNS 秒级生效上的实践
本文整理自虎牙中间件团队在 Nacos Meetup 的现场分享,阿里巴巴中间件受权发布. 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下5各部分: 背景介绍 ...
- DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应
摘自:http://www.freebuf.com/sectool/112076.html DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信.因为在我们的网络 ...
- C#曲线分析平台的制作(三,三层构架+echarts显示)
本文依据CSDN另一位网友关于三层构架的简单搭建,基于他的源码进行修改.实现了三层构架合理结构,以及从数据库中传递数值在echarts显示的实验目的. 废话不多说,show me codes: 具体构 ...
- 公共 DNS server IP 地址
公共 DNS server IP 地址 名称 DNS server IP 地址 CNNIC SDNS 1.2.4.8 210.2.4.8 114 DNS 114.114.114.114 114.114 ...
- python绝技 — 使用PyGeoIP关联IP地址和物理位置
准备工作 要关联IP与物理位置,我们需要有一个包含这样对应关系的数据库. 我们可以使用开源数据库GeoLiteCity,它能够较为准确地把IP地址与所在城市关联起来 下载地址:http://dev.m ...
- echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮
echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮 >>>>>>>>>>>>>>&g ...
- dns server 域名解析总结
1.客户有两种使用公网域名解析的方法,一种是,直接配置A记录,将域名直接解析到ip地址.第二种是,配置NS记录,将对这个域名的解析分配给另外一个域名服务器,这个域名服务器就是客户自己搭建的内部域名服务 ...
- dns server 配置
# cat /etc/named.conf//// named.conf//// Provided by Red Hat bind package to configure the ISC BIND ...
随机推荐
- stringUtils是apache下的Java jar补充包
org.apache.commons.lang.StringUtils StringUtils中一共有130多个方法,并且都是static的, 所以我们可以这样调用StringUtils.xxx().
- spring利用注解来注册bean到容器
1.spring利用注解来定义bean,或者利用注解来注册装配bean.包括注册到ioc中,装配包括成员变量的自动注入. 1.spring会自动扫描所有类的注解,扫描这些注解后,spring会将这些b ...
- NSArray 初始化
//NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾 //此外需要注意NSArray不能存放C语言的基础类型 NSObject *obj=[[NSObject alloc]init ...
- 持久化框架Hibernate 开发实例(二)
1 简述 通过使用Hibernate框架,开发者可以使用面向对象的方式来进行数据库访问,从而取代 以前使用JDBC进行数据库访问的方式.通过使用Hibernate框架,web应用可以通过面向 对象的方 ...
- 转:linux下面/usr/local和opt目录有何区别
/usr/local下一般是你安装软件的目录,这个目录就相当于在windows下的programefiles这个目录 /opt这个目录是一些大型软件的安装目录,或者是一些服务程序的安装目录 /opt ...
- 开发板挂载nfs服务器错误解析
输入mount -t nfs 192.168.1.110:/home/work /mnt,这时可能会出现 mount.nfs:access denied by server while mountin ...
- oracle .bash_profile
[oracle@redhat4 ~]$ vi .bash_profile # .bash_profile # Get the aliases and functionsif [ -f ~/.bashr ...
- Jenkins User on Apt-Get Install Installation
转自:http://stackoverflow.com/questions/6234016/jenkins-user-on-apt-get-install-installation QUESTION: ...
- How to install JDK (Java Development Kit) on Linux
This tutorial will guide you on how to install JDK (Java Development Kit) on Linux. Since I use Cent ...
- axis : java.lang.NoSuchMethodError
Hi friends,Iam getting the following error when deploying my app in jboss error.Iam new to axis .can ...