基于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 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
随机推荐
- POJ - 2528Mayor's posters (离散化+线段树区间覆盖)
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...
- 【bzoj3813】: 奇数国 数论-线段树-欧拉函数
[bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...
- 一看你就懂,超详细java中的ClassLoader详解(转)
转载地址 http://blog.csdn.net/briblue/article/details/54973413 目录(?)[-] Class文件的认识 你还记得java环境变量吗 J ...
- ios swift 实现简单MVP模式
在移动开发中,会用到各种架构,比如mvp,mvvm等,其目的就是为了让项目代码的可读性更好,减轻在android(activity) ios(controller)中的大量代码问题.接下来就开始我们的 ...
- mysql DISTINCT根据某字段去重同时查出其他字段
mysql有个关键字distinct用来去重的,但是使用时只能放在查询字段的最前边,如: SELECT DISTINCT user_id,age FROM t_user;若不是放在最前边,如:SELE ...
- P2253 好一个一中腰鼓!
题意:给你一个序列,初始是0,每次一个操作,把一个数^=1 每次求出最长01串的长度 正解:线段树(虽然暴力能过) 对于每个区间,记录三个值 lmax,以l为首的01串长度 rmax,以r为尾的01串 ...
- Java基础笔记(十九)——抽象类abstract
抽象类作为父类,不能实例化自己类型的对象,但可以通过向上转型实例化子类对象. public abstract class Animal{ } 比如eat(); ,每个动物子类都应有自己的方法,那An ...
- swift3.0 原生网络请求
func loadData() { let urlString = baseURL + NewsListURL + "\(self.page)"+"/20" ...
- 处女座和小姐姐(三)(数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G 来源:牛客网 题目描述 经过了选号和漫长的等待,处女座终于拿到了给小姐姐定制的手环,小姐姐看到以后直呼666! ...
- Til the Cows Come Home (dijkstra算法)
Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...