基于nodejs的DNS查询工具
开始这个实例之前,我们简单谈一下Node.js吧,Node.js是一个由JavaScript书写而成的强大Web开发框架,它让开发强壮的、伸缩性良好的服务器端Web应用变得更加简单、容易。这种技术诞生于09年末,在一个JavaScript大会上宣布,当时这项在服务器端运行JavaScript技术让所有参会者惊奇,当时这位提出者给出了一个“hello world”的程序。
var http = require('http');
var server = http.createServer(function(req,res){
res.writeHead();
res.end('Hello World');
});
server.listen(,'127.0.0.1');
console.log("please run at 127.0.0.1:3000");
于是在地址栏输入127.0.0.1:3000后就出现了我们非常熟悉的“Hello World”

好,简单介绍下Node.js,接下来就开始我们的正题,简单搭建一个DNS查询工具
准备前期:确保已经安装Node.js,网络上面有很多安装教程,在这里就不详细多说了
(1)需要加载的Node.js原生模块:
- Node.js的HTTP模块,用于创建Web的HTTP服务器
- Node.js的dns模块,用于DNS域名解析
- Node.js的fileSystem模块,用于读取HTML页面
- Node.js的querystring模块,处理请求参数
var http = require('http'),
dns = require('dns'),
fs = require('fs');
url = require('url');//处理文件url路径
querystring = require('querystring');//处理前端传回的字符串解析
(2)添加HTTP服务器代码,返回显示index.html(PS:如果是返回html数据,则Content-Type类型值为text/html)
http.createServer(function(req,res){
var pathname = url.parse(req.url).pathname;
req.setEncoding("utf8");
res.writeHead(200,{'Content-Type':'text/html'});
router(res,req,pathname);
}).listen(3000,'127.0.0.1'); //监听地址为127.0.0.1:3000
console.log("You can try it at 127.0.0.1:3000");
解析出请求中的地址后,用一个路由处理器判断区分用户是要显示index.html主页,还是要进行/parse解析操作,这里的路由控制器就是router方法
(3)处理url路由
function router(res,req,pathname){
switch(pathname){
case "/parse":parseDns(res,req);break; //解析url地址
default:goIndex(res,req); //显示index主页
}
}
- goIndex(res,req)函数,主要用于显示一个index.html页面,参数:res 为响应客户端请求对象;req 为客户端请求对象
function goIndex(res,req){
var readPath = __dirname + '/' + url.parse('index.html').pathname;
var indexPage = fs.readFileSync(readPath);//读取html数据,存放在indexpage变量之中
res.end(indexPage); //响应html数据到客户端
}
- parseDns(res,req)函数,主要用于解析客户端传递来的域名,并且返回该域名对应的IP地址
1 function parseDns(res,req){
2 var postData = "";
3 req.addListener("data",function(postDataChunk){
4 postData += postDataChunk;
5 });
6 req.addListener("end",function(){
7 var resData = getDns(postData,function(domain,addresses){
8 res.writeHead(200,{'Content-Type':'text/html'});
9 res.end("</html><head><meta http-equiv='content-type' content='text/html;charset=utf-8'></head><body><div style='text-align:center'>Domain:<span style='color:red'>" + domain + "</span><br/>IP:<span style='color:red'>" + addresses.join(',') + "</span></div></body></html>");
10 return;
11 })
12 })
13 }
14
15 function getDns(postData,callback){
16 var domain = querystring.parse(postData).search_dns;
17 console.log(postData); //search_dns=www.qq.com
18 console.log(querystring.parse(postData));//{ search_dns: 'www.qq.com' }
19 console.log(domain); //www.qq.com/
20 dns.resolve(domain,function(err,addresses){ //返回的addresses是一个数组
21 if(!addresses){
22 addresses=['不存在域名'];
23 }
24 callback(domain,addresses);
25 })
26 }
注意:由于dns.resolve()方法是一个异步执行函数,如果想使用它执行的结果,需要有一个回调函数,并把结果作为参数传入回调函数,才可以传递到函数外面!
(4)主页index.html代码
<!DOCTYPE html>
<html>
<head>
<title>DNS查询</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h1 style='text-align:center'>DNS查询工具</h1>
<div style='text-align:center'>
<form action="/parse" method="post">
查询DNS:<input type='text' name='search_dns'/>
<input type='submit' value='查询'/>
</form>
</div>
</body>
到了这里,已经实现了DNS查询功能了,我把(1)(2)(3)(4)步的代码都放在一个叫parse_dns.js的文件夹里面,在同一根目录文件下存放(5)步的index.html,然后再命令行窗口下找到当前目录(一开始我是用很笨的方法用cd命令找到文件根目录,后来发现sublimeText的Side Bar插件可以直接在所选文件夹右键点击“Open/Run”,直接打开一个叫Window PowerShell的蓝色窗口,功能和cmd窗口一样,在那里已经帮你自动找好文件路径,非常方便),然后直接输入node parse_dns.js,即可显示"You can try it at 127.0.0.1:3000"

在浏览器地址栏输入“127.0.0.1:3000”,就有下图界面

输入“www.baidu.com”进行查询,页面就跳到了“127.0.0.1:3000/parse”

进行到这一步已经是基本完成了,但是笔者并没有将这个系统进行模块化,比如分成服务器创建模块、路由处理模块、逻辑控制模块、错误处理模块等,要想让程序更加健壮并且项目可维护性高,这个是必不可少的,由于是刚学node不久,日后必定写上更好的版本。
思考:
(1)这个小工具还存在一些小问题,就是如果我输入类似“https://www.baidu.com/”这样子的格式,程序会解析不成功,而返回“域名不存在”,所以日后我需要引入Node.js的原生模块url,用于url的分解

(2)笔者输入“www.qq.com”解析出来的IP,放在浏览器地址栏里打开但并不是腾讯的主页,然而输入“www.baidu.com”解析出来的IP却可以呈现度娘的搜索首页,笔者的室友说是因为有多个服务器解析出来的多个IP,所以这个IP可能不是我正在看到的腾讯主页,还有一个解释是因为端口问题,百度搜索首页是默认80端口,而腾讯首页不是,所以要知道端口号并加到IP后面才可以访问,问题还没搞清楚,所以笔者还会继续研究~
基于nodejs的DNS查询工具的更多相关文章
- Cronicle 基于nodejs 的分布式任务调度工具
Cronicle 是一款不多的分布式任务调度工具,基于nodejs 开发,同时包含看web UI,从官方介绍看到的UI还是 挺不错的,而且功能很丰富,值得试用下 参考资料 http://cronicl ...
- DNS查询工具:host、nslookup、dig
作者:zhanhailiang 日期:2014-11-01 1. host host提供域名到IP地址的双向解析: host默认通过/etc/resolv.conf读取Name Server来解析,除 ...
- foy: 轻量级的基于 nodejs 的通用 build 工具
npm 的 scripts 下写的命令太多就很容易很乱,各种第三方轮子都只能解决一部分问题,总感觉不是很好用,想找个类似 make 的工具只能找到 jake, 可是 jake 的 API 太老,居然很 ...
- DNS查询相关
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/45 一种简单的设计方式是在因特网上使用一个DNS服务器,该服务器 ...
- PHP mysql查询工具
PHP基于PDO的 mysql 查询工具 单页面实现,将页面放在任意目录即可. 访问用户 admin 密码 password 代码很简单,主要为了在没有phpMyAdmin时方便执行SQL. 效果如下 ...
- Linux基础命令---host域名查询工具
host host是一个常用的DNS查询工具,经常用来查询域名.检查域名解析是否正确. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ...
- 基于阿里云 DNS API 实现的 DDNS 工具
0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿 ...
- 被动信息收集1——DNS基础 + DNS解析工具 NSLOOKUP使用
被动信息收集 特点: 基于公开渠道 与目标不直接接触 避免留下一切痕迹 标准參考--OSINT: 美国军方 北大西洋公约组织 名词解释 DNS--Domain Name System 域名系统 因特网 ...
- 转-基于NodeJS的14款Web框架
基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
随机推荐
- Internet路由-主机路由表和转发表
1.路由表 路由信息最终要存储在用于路由器的主机或者专业路由器上,存放这些信息的地方称为路由表.其中包含三元素:目标地址,掩码,下一跳. 1.1.查询路由表的开销 有人认为查询路由表是一件和交换机查询 ...
- Qt 学习之路 2(26):反走样
Qt 学习之路 2(26):反走样 豆子 2012年11月12日 Qt 学习之路 2 9条评论 我们在光栅图形显示器上绘制非水平.非垂直的直线或多边形边界时,或多或少会呈现锯齿状外观.这是因为直线和多 ...
- vue四、实例
1.new Vue创建根实例 2.data对象,所有的属性加入到 Vue 响应式系统-值发生改变时,视图自动变更为新值 只有实例被创建时存在的属性才会响应式改变,后增加的不会 vue定义的实例属性和方 ...
- STS(spring tool suite)修改默认编码
安装STS后首先要做的修改默认编码: 1.windows--perferences--general--workspace,Text file encoding设置成utf-8 2.windows-- ...
- LUNA16数据集(二)肺结节可视化
在检测到肺结节后,还需要可视化,这样才能为诊断服务. 我使用的项目地址为:https://github.com/wentaozhu/DeepLung 项目基于论文:DeepLung: Deep 3D ...
- js 遍历tree的一个例子
小例子蕴含着到力量,我希望自己有改变自己生活的能力,自己有主宰自己命运的能力... 备注:这个例子有问题. <!DOCTYPE html> <html lang="en&q ...
- js 返回 差 集
//接受两个数组,返回差集 function getDiffSet(a,b){ a.sort(charSort); b.sort(charSort); if(a.length>=b.length ...
- 在基于AngularJs架构的ABP项目中使用UEditor
[前提须知] 读过此篇博客 了解angular-ueditor 了解ABP如何使用 会使用VS2017 [1.下载ABP模板] https://aspnetboilerplate.com/Templa ...
- HDU-Fibonacci Again(打表找规律)
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2). ...
- mongo察看replica set副本集primary主节点
printjson(db.adminCommand( { isMaster: 1 } ));