基於nodejs的DNS查詢工具

来源:http://www.cnblogs.com/DTBelieve/archive/2016/04/02/5346641.html
-Advertisement-
Play Games

開始這個實例之前,我們簡單談一下Node.js吧,Node.js是一個由JavaScript書寫而成的強大Web開發框架,它讓開發強壯的、伸縮性良好的伺服器端Web應用變得更加簡單、容易。這種技術誕生於09年末,在一個JavaScript大會上宣佈,當時這項在伺服器端運行JavaScript技術讓所 ...


  開始這個實例之前,我們簡單談一下Node.js吧,Node.js是一個由JavaScript書寫而成的強大Web開發框架,它讓開發強壯的、伸縮性良好的伺服器端Web應用變得更加簡單、容易。這種技術誕生於09年末,在一個JavaScript大會上宣佈,當時這項在伺服器端運行JavaScript技術讓所有參會者驚奇,當時這位提出者給出了一個“hello world”的程式。

1 var http = require('http');
2 var server = http.createServer(function(req,res){
3     res.writeHead(200);
4     res.end('Hello World');
5 });
6 server.listen(3000,'127.0.0.1');
7 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模塊,處理請求參數
1 var http = require('http'),
2     dns = require('dns'),
3     fs = require('fs');
4     url = require('url');//處理文件url路徑
5     querystring = require('querystring');//處理前端傳回的字元串解析

(2)添加HTTP伺服器代碼,返回顯示index.html(PS:如果是返回html數據,則Content-Type類型值為text/html)

1 http.createServer(function(req,res){
2     var pathname = url.parse(req.url).pathname;
3     req.setEncoding("utf8");
4     res.writeHead(200,{'Content-Type':'text/html'});
5     router(res,req,pathname);
6 }).listen(3000,'127.0.0.1');  //監聽地址為127.0.0.1:3000
7 console.log("You can try it at 127.0.0.1:3000");

解析出請求中的地址後,用一個路由處理器判斷區分用戶是要顯示index.html主頁,還是要進行/parse解析操作,這裡的路由控制器就是router方法
(3)處理url路由

1 function router(res,req,pathname){
2     switch(pathname){
3         case "/parse":parseDns(res,req);break;    //解析url地址
4         default:goIndex(res,req);                 //顯示index主頁
5     }
6 }    
  • goIndex(res,req)函數,主要用於顯示一個index.html頁面,參數:res  為響應客戶端請求對象;req  為客戶端請求對象
1 function goIndex(res,req){
2     var readPath = __dirname + '/' + url.parse('index.html').pathname;
3     var indexPage = fs.readFileSync(readPath);//讀取html數據,存放在indexpage變數之中
4     res.end(indexPage);                //響應html數據到客戶端
5 }
  • parseDns(res,req)函數,主要用於解析客戶端傳遞來的功能變數名稱,並且返回該功能變數名稱對應的IP地址
 1  1 function parseDns(res,req){
 2  2     var postData = "";
 3  3     req.addListener("data",function(postDataChunk){
 4  4         postData += postDataChunk;
 5  5     });
 6  6     req.addListener("end",function(){
 7  7         var resData = getDns(postData,function(domain,addresses){
 8  8             res.writeHead(200,{'Content-Type':'text/html'});
 9  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 10             return;
11 11         })
12 12     })
13 13 }
14 14 
15 15 function getDns(postData,callback){
16 16     var domain = querystring.parse(postData).search_dns;
17 17     console.log(postData);                     //search_dns=www.qq.com
18 18     console.log(querystring.parse(postData));//{ search_dns: 'www.qq.com' }
19 19     console.log(domain);                     //www.qq.com/
20 20     dns.resolve(domain,function(err,addresses){  //返回的addresses是一個數組
21 21         if(!addresses){
22 22             addresses=['不存在功能變數名稱'];
23 23         }
24 24         callback(domain,addresses);
25 25     })
26 26 }

註意:由於dns.resolve()方法是一個非同步執行函數,如果想使用它執行的結果,需要有一個回調函數,並把結果作為參數傳入回調函數,才可以傳遞到函數外面!

(4)主頁index.html代碼

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>DNS查詢</title>
 5     <meta http-equiv="content-type" content="text/html;charset=utf-8">
 6 </head>
 7 <body>
 8     <h1 style='text-align:center'>DNS查詢工具</h1>
 9     <div style='text-align:center'>
10         <form action="/parse" method="post">
11             查詢DNS:<input type='text' name='search_dns'/>
12             <input type='submit' value='查詢'/>
13         </form>
14     </div>
15 </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後面才可以訪問,問題還沒搞清楚,所以筆者還會繼續研究~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先,我不是一個開發者,只是業餘學習者。其次我的文化水平很低,寫這個主要是記錄一下當前對於這塊的理解,因為對於一個低水平 的業餘學習者來說,忘記是很平常的事,因為接觸、應用的少,現在理解,可能過段時間就會忘了,自己記錄下來應該可以少走些彎路,以免從頭再來查找資料。 另外,如果我的記錄能幫忙到一些朋友 ...
  • 極驗目前的用戶超過7萬家網站,日均驗證量1億次,作為一家專註於驗證安全服務的公司,極驗所要面臨的併發壓力主要表現在以下幾點: 日益增加的用戶併發量。 驗證請求是全動態過程,不能夠進行緩存。 每一次請求都會造成資料庫的讀寫。 處理請求需要耗費CPU大量的時間進行模型的計算。 作為抗擊黑產的第一線,可能 ...
  • Element類型用於表現XML或HTML元素,提供對元素標簽名,子節點及特性的訪問。原型鏈的繼承關係為 某節點元素.__proto__->(HTML某元素Element.prototype)->HTMLElement.prototype->Element.prototype->Node.proto ...
  • html文本垂直居中對齊,代碼如下: <div id="box" style="height:100px; line-height:100px; border:1px solid #cccccc;margin:50px;"> <span style="vertical-align:middle;di ...
  • 本文章向碼農們介紹motion-path在css動畫中的使用實例分析,需要的碼農可以參考一下。 使用motion path,作者可以讓圖像物體按照指定的路徑運動。谷歌瀏覽器積極的要實現這個CSS特征,我想主要motion-path是SVG動畫里獨特的亮點,而谷歌瀏覽器已經決定放棄SVG SMIL,所 ...
  • 前端工作一年了,期間由於工作需要,也做了一些產品的設計,因為自己的目標就是做編程,所以婉拒了與產品相關的一些任務,打算主要把精力放到編程這方面. PS:2015年1月進軍編程行業。 廢話不多講,這一年頁面改版了N次,以至於設計師都撂挑子了,,,頁面做多了,經驗自然就有了。 背景(前端小白,迫於生計放 ...
  • 現如今做電商網站必不可少的一個效果就是限時搶購,這也是各大電商網站的一種促銷手段。下麵的圖片就是聚划算上面的限時搶的效果 一、實現限時搶的效果需要用到的知識 :Javascript Date()對象 Date()返回當前的日期和事件 getYear()返回年份 獲得年最好用 getFullYear( ...
  • 第一章、瞭解web及網路基礎 1.2 http的誕生 HTTP於1990年問世,那時候HTTP並沒有作為正式的標準被建立,被稱為HTTP/0.9 HTTP正式作為標準被公佈是在1996年5月,版本被命名為HTTP/1.0,該協議至今仍被廣泛用在伺服器端。 HTTP/1.1於1997年1月公佈,是目前 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...