开始这个实例之前,我们简单谈一下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原生模块

  1. Node.js的HTTP模块,用于创建Web的HTTP服务器
  2. Node.js的dns模块,用于DNS域名解析
  3. Node.js的fileSystem模块,用于读取HTML页面
  4. 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查询工具的更多相关文章

  1. Cronicle 基于nodejs 的分布式任务调度工具

    Cronicle 是一款不多的分布式任务调度工具,基于nodejs 开发,同时包含看web UI,从官方介绍看到的UI还是 挺不错的,而且功能很丰富,值得试用下 参考资料 http://cronicl ...

  2. DNS查询工具:host、nslookup、dig

    作者:zhanhailiang 日期:2014-11-01 1. host host提供域名到IP地址的双向解析: host默认通过/etc/resolv.conf读取Name Server来解析,除 ...

  3. foy: 轻量级的基于 nodejs 的通用 build 工具

    npm 的 scripts 下写的命令太多就很容易很乱,各种第三方轮子都只能解决一部分问题,总感觉不是很好用,想找个类似 make 的工具只能找到 jake, 可是 jake 的 API 太老,居然很 ...

  4. DNS查询相关

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/45 一种简单的设计方式是在因特网上使用一个DNS服务器,该服务器 ...

  5. PHP mysql查询工具

    PHP基于PDO的 mysql 查询工具 单页面实现,将页面放在任意目录即可. 访问用户 admin 密码 password 代码很简单,主要为了在没有phpMyAdmin时方便执行SQL. 效果如下 ...

  6. Linux基础命令---host域名查询工具

    host host是一个常用的DNS查询工具,经常用来查询域名.检查域名解析是否正确. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法       ...

  7. 基于阿里云 DNS API 实现的 DDNS 工具

    0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿 ...

  8. 被动信息收集1——DNS基础 + DNS解析工具 NSLOOKUP使用

    被动信息收集 特点: 基于公开渠道 与目标不直接接触 避免留下一切痕迹 标准參考--OSINT: 美国军方 北大西洋公约组织 名词解释 DNS--Domain Name System 域名系统 因特网 ...

  9. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

随机推荐

  1. C#静态类 转载:(原文:http://www.cnblogs.com/chenlulouis/ )

    静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享. 探究 public static class StaticTestClass{    public static int ...

  2. 老男孩Day5作业:电子银行购物商城

    1.作业需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录支持账户间转账 记录每月日常消 ...

  3. C++基础学习7:new/delete操作符

    在C语言中,动态分配和释放内存的函数是malloc.calloc和free,而在C++语言中,new.new[].delete和delete[]操作符通常会被用来动态地分配内存和释放内存. 需要注意的 ...

  4. CF796A Buying A House 模拟

    Zane the wizard had never loved anyone before, until he fell in love with a girl, whose name remains ...

  5. 二创建maven父子项目

    关于maven中的parent聚合一直都有没好好总结,固有这篇. ------------------------------------------------------------------- ...

  6. 【ACM】N皇后问题

    N皇后问题 #include <iostream> #include <cmath> using namespace std; ; //判断当前位置的皇后加入是否成立 bool ...

  7. python 操作excel 的包 函数

    ###########sample 1 https://blog.csdn.net/chengxuyuanyonghu/article/details/54951399 python操作excel主要 ...

  8. 持久层框架---jdbc

    1.JDBC编程步骤: 1.1 加载数据库驱动: 1.2 获取数据库连接: 1.3 通过Connection对象创建Statement对象: 1.4 使用Statement对象执行SQL语句: 1.5 ...

  9. 关系型数据库---MySQL---事务

    1.概述 1.1 事务:在对业务相关的一系列数据进行操作时,需要保证数据操作的完整性(要么全部成功.要么全部失败): 1.2 MySQL中支持事务的存储引擎是:Innodb: 1.3 事务用来管理in ...

  10. Google Chrome实用插件

    Tempermonkey 打开上面的链接需要KXSW_VPN_FQ,下面提供国内获取方式 下载 Tempermonkey_4.7 [提取码:7019]并解压 打开C:\Users\%USERNAME% ...