新技術你知道嗎?Node.js的HelloWorld!

大名鼎鼎的JavaScript引擎V8想必不少朋友都知道,即使你不知道V8的名字,總聽說過Google Chrome瀏覽器的JavaScript引擎是最快的吧.其實Google Chrome瀏覽器用的就是V8.今天我們介紹的一款開源軟件也正是在V8的基礎上發展而來的,不同的是,它不是運行於瀏覽器中,而是獨立出來,用於其它領域,比如說應用服務器什麼的。

言過正傳,Node.js是一套用來編寫高性能網絡服務器的JavaScript工具包,一系列的變化由此開始。他。Node爲創建http服務器作了優化,所以你在網上看到的大部分示例和庫都是集中在web上(http框架、模板庫等)。它的官方簡介如下:

“Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.”

翻譯過來就是:“Node.js是建立在Chrome瀏覽器的JavaScript運行時基礎上,用於快速構建可擴展的網絡應用的平臺。 Node.js的使用事件驅動,非阻塞I / O模型,使得它量輕高效,可完美的用於分佈式環境下的數據密集型、實時應用程序。”

這裏需要強調的是,它還很“新”,目前官方的版本是“v0.6.12”,也就是說還有許多需要改進和完善的地方,當然這並不妨礙我們通過一個“HelloWorld”測試程序來窺其一斑,也不會妨礙大牛們通過對其特點的發現和源碼的分析,學習和借鑑其先進的思想。有人說互聯網時代,應用程序永遠都是Beta版,我不否認這樣做的積極意義,但請務必注意,如果你今天就打算將其用於實際應用的話,請先做好必要的測試,當你發現了它足夠多的BUG和限制條件後,也許你纔有條件穩妥的將其應用於實際。請相信,“Node.js”就是這樣的Beta版。

一、首先讓我們建立起環境:

1、到“http://nodejs.org/”處下載最版本,有Windows版和Macintosh版安裝包,還有源碼包,我下載的是Windows版的安裝包;

2、安裝運行環境,對Windows版來說簡單方便,執行安裝包即可。它會默認安裝到“Program Files”目錄下。

二、建立HelloWorld測試服務器程序:

用記事本新建一個JavaScript文件:svr.js

 1  var http = require('http');  //請求http模塊,以下程序中,變量http代表該模塊
 2  var getCount=0; //爲測試使用的變量,用於記錄客戶端請求次數
 3  
 4  console.time('[HelloWorldSvr][Start]'); //開始服務啓動計時器,命名並開始一個計時器,將來通過其名稱來結束該計時器,並輸出到控制檯
 5  
 6  http.createServer(function (request, response) { //創建一個http服務器,唯一的參數是一個匿名的請求響應函數,如下
 7      getCount++;  //請求計數器加1
 8      var getNo=getCount; //記錄本次請求的序號,方便日誌輸出
 9  
10      console.time('[HelloWorldSvr][Get]'+getNo); //開始請求響應計時器
11  
12      console.log(request.url); //向控制檯輸出請求的路徑
13      //以下多行簡單的忽略請求的路徑,直接向http返回一段html文本
14      response.writeHead(200, {'Content-Type': 'text/html'});
15      response.write('<html><body>');
16      response.write('<h1>*** Node.js ***</h1>');
17      response.write('<h2>Hello World!'+getNo+'</h2>');
18      response.end('</body></html>');
19      console.timeEnd('[HelloWorldSvr][Get]'+getNo); //結束請求相應計時器,並向控制檯輸出本次請求相應花費的時間
20  }).listen(8124);  //開始偵聽8124端口,也就是說,從此刻開始本機8124端口上建立起了一個簡單的http服務器,不管如何請求,都返回一段簡單的html文本
21  
22  console.log('[HelloWorldSvr][Start] running at http://127.0.0.1:8124/'); //向控制檯輸出服務啓動的信息
23  console.timeEnd('[HelloWorldSvr][Start]'); //結束服務啓動計時器,並向控制檯輸出服務啓動花費的時間

以上就是構建一個簡單的http服務器的全部代碼,這個服務啓偵聽8124端口,對任何http請求都返回一段包含請求序號的html網頁。

 

三、運行並測試服務器程序:

要將其運行起來可在命令行下輸入(假設Node.js安裝在“c:\Program Files\nodejs\”目錄,你的新建的svr.js文件就放在其中):

"C:\Program Files\nodejs\node.exe" svr.js

運行結果如下:

我們看到,我們的HelloWorld服務器已經運行於http://127.0.0.1:8124,啓動時間爲8毫秒。

如何停下來呢?簡單,只需要在命令行中輸入CTL+C就行。

讓我們再次運行起HelloWorld服務器,並打開瀏覽器訪問http://127.0.0.1:8124地址,結果如下:

瀏覽器顯示了返回的網頁,刷新幾次可以觀察網頁內容的變化(請求序號)和服務器控制檯的日誌。如上圖,服務器啓動花了16毫秒,瀏覽器請求了主機127.0.0.1地址的8124端口下的根路徑"/",服務器響應花費了1毫秒。之後還有多次請求,包括瀏覽器其請求網站圖標的請求(路徑爲“/favicon.ico”,呵呵,不幸的是,我們的服務器簡單到只會返回同一個網頁)。

 

四、建立HelloWorld測試客戶端程序:

clt.js

 1 var http = require('http'); //請求使用http模塊,變量http將在以下代碼中指代該模塊
 2 console.time('[HelloWorldClt][Start]'); //開始客戶端啓動計時器
 3 
 4 var testHttpGetCountMax=100; //測試循環次數
 5 var testHttpGetCount=0; //測試請求計數器
 6 var testHttpResCount=0; //測試返回計數器
 7 
 8 var testHttpGet=function(aHost,aPort,aPath){ //定義測試方法,輸入參數分別爲:主機地址,端口號和路徑
 9 
10 testHttpGetCount++; //每次調用測試方法,請求計數器+1
11 var testNo=testHttpGetCount; //本次測試編號
12 
13 var options = { //http請求的參數,用於接下來的http協議的GET調用的選項
14     host:aHost, //主機
15     port:aPort, //端口
16     path:aPath  //路徑
17 };
18 
19 //創建http的GET請求對象,第一個參數爲調用選項,第二個參數爲返回回調函數,用於處理請求的返回
20 var req= http.get(options, function(res){ 
21     //以下幾行註釋用於在控制檯輸出實際的返回信息,有興趣的朋友可以取消註釋看看
22     //console.time('[HelloWorldClt][Get]'+testNo);
23     //console.log('STATUS: ' + res.statusCode);
24     //console.log('HEADERS: ' + JSON.stringify(res.headers));
25     //res.setEncoding('utf8');
26     //res.on('data', function (chunk) {
27     //    //console.log('BODY: ' + chunk);
28     //});
29 
30     //res爲回調函數的參數,代表http協議get方法返回的對象,以下給res設置結束時間'end'的處理函數
31     res.on('end', function () {
32         //console.timeEnd('[HelloWorldClt][Get]'+testNo);
33         testHttpResCount++; //每結束一個請求,測試返回計數器+1
34         if(testHttpResCount==testHttpGetCountMax){ //如果返回數等於測試循環數
35             console.timeEnd('[HelloWorldClt][GetTest'+testHttpGetCountMax+']'); //結束測試計時器,並輸出測試總時間
36         }
37     });
38 
39 });
40 
41 //給請求對象設置錯誤事件'error'的處理函數
42 req.on('error', function(e) { 
43     //console.timeEnd('[HelloWorldClt][Get]'+testNo);
44     console.log('Err: ' + e.message); //輸出錯誤信息
45 });
46 
47 };
48 
49 console.time('[HelloWorldClt][GetTest'+testHttpGetCountMax+']'); //開始測試計時器
50 for (i = 0; i < testHttpGetCountMax; i++) //循環若干次
51 {
52     testHttpGet('127.0.0.1',8124,'/'); //請求服務器
53 }
54 
55 console.timeEnd('[HelloWorldClt][Start]'); //結束客戶端啓動計時器,並輸出到控制檯

以上建立一個客戶端測試程序,循環多次調用服務器,並計時。這段測試代碼可以充分顯示Node.js的事件驅動的優勢,以及javaScript函數式編程的魅力。代碼中已經有足夠的註釋了,這裏不再重述。需要指出的是,Node.js編程繼承了JavaScript的函數式編程和麪向對象的雙重優勢,在此基礎上,還提供了模塊化的封裝,當然這些也超出了本文的範圍,本文中所有代碼均以簡單爲目的,畢竟只是一個"HelloWorld"。

五、運行並測試客戶端:

新開一個命令行窗口,並輸入(假設Node.js安裝在“c:\Program Files\nodejs\”目錄,你的新建的clt.js文件就放在其中):

"C:\Program Files\nodejs\node.exe" clt.js

運行結果如下:

我們看到,客戶端啓動花了21毫秒,向服務器請求100次,共花費199毫秒。

 

六、小結

通過這樣兩段代碼,我們可以看出:

1、Node.js的運行環境相對簡單,便於維護;

2、Node.js可以運行於服務器、也可以用於客戶端;

3、Node.js繼承了JavaScript的優勢,特別是運用於服務器,可以構建方便靈活的Web2.0的服務端;

4、Node.js提供了一個高度柔性的框架,可方便的擴充模塊。

當然,運用Node.js也需要注意:

1、 它還是Beta版,Beta有風險,使用需謹慎;

2、除非你對JavaScript本身有充分的瞭解,特別是面向對象以及函數式編程等等,請不要盲目使用,補補課先;

3、它只是一個優秀的框架和運行環境,目前還談不上平臺,要用於實際,還需要自己定義相當多的模塊才行(http://nodejs.org/docs/latest/api/appendix_1.html處是其官方推薦的一些第三方模塊)。

總的來說,使用Node.js給人一種清新的感覺,就像當初Web2.0的Ajax使人們重新發現JavaScript一樣,這是JavaScript邁向成功的又一領域的開始。厭倦了WS的龐雜、Tomcat的簡約、IIS的善變後,拿起JavaScript給自己寫個應用服務器吧,至少在特定應用下,它會帶給你驚喜。我喜歡編程不僅是因爲它是解決問題方法,更是因爲好的程序可以給人帶來美的享受。。。。


作者:汪峯 www.otlive.cn



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章