基于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 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
随机推荐
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...
- SP8791 DYNALCA - Dynamic LCA
\(\color{#0066ff}{ 题目描述 }\) 有一个森林最初由 n (\(1 \le n \le 100000\))n(\(1\leq n\leq 100000\)) 个互不相连的点构成 你 ...
- CF1076C Meme Problem 数学
Try guessing the statement from this picture: You are given a non-negative integer d . You have to f ...
- kuangbin专题七 HDU1754 I Hate It (单点修改维护最大值)
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有 ...
- 8. sql 片段
sql 片段: <sql id="columnBase"> `id`, `title`, `author_id` as authorId, `state`, `feat ...
- for别名
name:for(int i =0 ;i< a.length;i++){ System.out.println(i); for(int j =0;j<i;j++){ continue na ...
- springmvc 4.x 转json
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter&q ...
- Codeforces - 466C 双指针
首先要判sum是否是3的整数倍 然后把符合条件的前缀和以及后缀和分别加入到静态vector中 最后扫一下j和k定位在哪然后求总长的差来更新答案 注意i j k至少隔1位,所以lower_bound是s ...
- sonar 测试覆盖率
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</a ...
- Java 类型转换(int->String)
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...