今天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物理位置的更多相关文章

  1. 软件架构自学笔记-- 转载“虎牙在全球 DNS 秒级生效上的实践”

    虎牙在全球 DNS 秒级生效上的实践 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下 5 各部分: 背景介绍: 方案设计和对比: 高可用: 具体实践和落地: ...

  2. 虎牙在全球 DNS 秒级生效上的实践

    本文整理自虎牙中间件团队在 Nacos Meetup 的现场分享,阿里巴巴中间件受权发布. 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下5各部分: 背景介绍 ...

  3. DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应

    摘自:http://www.freebuf.com/sectool/112076.html DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信.因为在我们的网络 ...

  4. C#曲线分析平台的制作(三,三层构架+echarts显示)

    本文依据CSDN另一位网友关于三层构架的简单搭建,基于他的源码进行修改.实现了三层构架合理结构,以及从数据库中传递数值在echarts显示的实验目的. 废话不多说,show me codes: 具体构 ...

  5. 公共 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 ...

  6. python绝技 — 使用PyGeoIP关联IP地址和物理位置

    准备工作 要关联IP与物理位置,我们需要有一个包含这样对应关系的数据库. 我们可以使用开源数据库GeoLiteCity,它能够较为准确地把IP地址与所在城市关联起来 下载地址:http://dev.m ...

  7. echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮

    echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮 >>>>>>>>>>>>>>&g ...

  8. dns server 域名解析总结

    1.客户有两种使用公网域名解析的方法,一种是,直接配置A记录,将域名直接解析到ip地址.第二种是,配置NS记录,将对这个域名的解析分配给另外一个域名服务器,这个域名服务器就是客户自己搭建的内部域名服务 ...

  9. dns server 配置

    # cat /etc/named.conf//// named.conf//// Provided by Red Hat bind package to configure the ISC BIND ...

随机推荐

  1. iOS开发--多线程

    前面在<Bison眼中的iOS开发多线程是这样的(二)>一文中讲完了多线程的NSThread,不难发现这种方式的多线程实现起来非常的复杂,为了简化多线程的开发,iOS提供了GCD来实现多线 ...

  2. Android:让EditText不自动获取焦点

    解决方法: 在EditText的父级控件中加入属性: android:focusable="true" android:focusableInTouchMode="tru ...

  3. HDU 3757 Evacuation Plan DP

    跟 UVa 1474 - Evacuation Plan 一个题,但是在杭电上能交过,在UVa上交不过……不知道哪里有问题…… 将施工队位置和避难所位置排序. dp[i][j] 代表前 i 个避难所收 ...

  4. Linux文件目录结构详解

    整理自<鸟哥的私房菜> 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于 ...

  5. Oracle过程包加密

    Oracle加绕功能可以将PL/SQL代码实现部分隐藏,如存储过程.函数.包体等均可使用加绕功能,下面以一个存储过程实现部分加绕来展示Oracle加绕功能的使用.  加绕方法一: 1.编写如下存储过程 ...

  6. JPA和Hibernate的区别

    JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分. Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的 ...

  7. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

    重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内 ...

  8. bzoj2788

    明显是一个差分约束系统 对于第一种限制,其实就是x[a]+1<=x[b] x[b]-1<=x[a] 根据三角不等式很容易建图 但这题他比较奇怪,问的是X最多不同取值的个数 根据这张图的特殊 ...

  9. linq 之左连接

    List<ArticleModel> articleList = articleRepository.GetAllArticle(); List<UsersModel> use ...

  10. Android listView如何判断数据多屏显示 (2012-03-06 09:47:04)

    @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int tot ...