node.js的安裝使用與示例_第1頁
node.js的安裝使用與示例_第2頁
node.js的安裝使用與示例_第3頁
node.js的安裝使用與示例_第4頁
node.js的安裝使用與示例_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

...wd......wd......wd...成都信息工程學院Node.js的安裝使用及例如周星2012/7/5本文檔分為介紹篇和使用篇,介紹篇關(guān)于node.js的介紹、應(yīng)用及前景等;使用篇包括node.js安裝和命令、架起一個服務(wù)、完成一個〞hello,world〞、搭建一個只支持靜態(tài)網(wǎng)頁的web服務(wù)器、使node.js和socket.io實現(xiàn)websocket,搭建小型聊天室、node.js和jquery的結(jié)合,通過本文檔初學者可以很快了解node.js及其使用方法,當然本文檔只是一個簡要概括,更多的功能需要您深入去探究。有幾個新概念需要您了解:V8引擎、Rest、服務(wù)器javascript。目錄介紹篇:2什么是node.js2Node.js的適用場景2Node旨在解決什么問題2ESTfulAPI3Twitter隊列3電子游戲統(tǒng)計數(shù)據(jù)3映像文件服務(wù)器3下面答復一些對于node.js和舊知識的一些問題41服務(wù)端JS的實現(xiàn),和我們傳統(tǒng)的服務(wù)端實現(xiàn)相比,優(yōu)勢在哪里呢42node.js的開發(fā)效率和本錢,具體表達在哪呢4使用篇:41Node.js的安裝和控制臺命令42架一個服務(wù)6一、批量執(zhí)行代碼6二、前端呢還是后端這是個問題。6三、模塊模塊7四、服務(wù)之HelloWorld73完成HelloWorld94搭建一個靜態(tài)的web服務(wù)器11一讀寫文件11二、分析請求路徑125Websocket的實現(xiàn)15一、WebSocket是什么15二、與傳統(tǒng)的相比,它的優(yōu)點是什么15三、WebSocket能干什么15四、WebSocket協(xié)議與Socket.IO模塊156利用Websocket實現(xiàn)聊天室177websocket與jquery的結(jié)合19完畢語21介紹篇:什么是node.js在介紹node.js之前,我們首先了解一下node.js的重要性,看看都有誰在用它。微軟的云服務(wù)Azure已經(jīng)開場支持Node.js、還有就是Ebay、Yahoo、Linkedin,這些IT界的大佬都在用,node.js未來肯定是光明的。下面再說什么是node.js,node.js的官方網(wǎng)站這樣自我描述:Node.jsisaplatformbuiltonChrome'sJavaScriptruntimeforeasilybuildingfast,scalablenetworkapplications.Node.jsusesanevent-driven,non-blockingI/Omodelthatmakesitlightweightandefficient,perfectfordata-intensivereal-timeapplicationsthatrunacrossdistributeddevices.翻譯過來就是:Node.js是一個平臺,建設(shè)在ChromeJavaScript運行時之上,目的是建設(shè)快速、可伸縮的網(wǎng)絡(luò)應(yīng)用。Node.js使用事件驅(qū)動,非阻塞的I/O模式,這使得他是輕量而高效的,能夠在分布設(shè)備上完美運行高數(shù)據(jù)吞吐的實時應(yīng)用。如果還想深入了解,可能還需要您去了解一下google的V8引擎。介紹到此為止,下面我們來看一下node.js的適用場景。Node.js的適用場景Node旨在解決什么問題Node公開宣稱的目標是“旨在提供一種簡單的構(gòu)建可伸縮網(wǎng)絡(luò)程序的方法〞。當前的服務(wù)器程序有什么問題我們來做個數(shù)學題。在Java?和PHP這類語言中,每個連接都會生成一個新線程,每個新線程可能需要2MB配套內(nèi)存。在一個擁有8GBRAM的系統(tǒng)上,理論上最大的并發(fā)連接數(shù)量是4,000個用戶。隨著您的客戶端根基的增長,您希望您的web應(yīng)用程序支持更多用戶,這樣,您必須添加更多服務(wù)器。當然,這會增加業(yè)務(wù)本錢,尤其是服務(wù)器本錢、運輸本錢和人工本錢。除這些本錢上升外,還有一個技術(shù)問題:用戶可能針對每個請求使用不同的服務(wù)器,因此,任何共享資源都必須在所有服務(wù)器之間共享。例如,在Java中,靜態(tài)變量和緩存需要在每個服務(wù)器上的JVMs之間共享。這就是整個web應(yīng)用程序架構(gòu)中的瓶頸:一個服務(wù)器能夠處理的并發(fā)連接的最大數(shù)量。Node解決這個問題的方法是:更改連接連接到服務(wù)器的方式。每個連接都創(chuàng)立一個進程,該進程不需要配套內(nèi)存塊,而不是為每個連接生成一個新的OS線程〔并向其分配一些配套內(nèi)存〕。Node聲稱它絕不會死鎖,因為它根本不允許使用鎖,它不會直接阻塞I/O調(diào)用。Node還宣稱,運行它的服務(wù)器能支持數(shù)萬個并發(fā)連接。事實上,Node通過將整個系統(tǒng)中的瓶頸從最大連接數(shù)量更改到單個系統(tǒng)的流量來改變服務(wù)器面貌。ESTfulAPI提供RestfulAPI的Web服務(wù)接收幾個參數(shù),解析它們,組合一個響應(yīng),并返回一個響應(yīng)〔通常是較少的文本〕給用戶。這是適合Node的理想情況,因為您可以構(gòu)建它來處理數(shù)萬條連接。它仍然不需要大量邏輯;它本質(zhì)上只是從某個數(shù)據(jù)庫中查找一些值并將它們組成一個響應(yīng)。由于響應(yīng)是少量文本,入站請求也是少量的文本,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求。Twitter隊列想像一下像Twitter這樣的公司,它必須接收tweets并將其寫入數(shù)據(jù)庫。實際上,每秒幾乎有數(shù)千條tweet到達,數(shù)據(jù)庫不可能及時處理頂峰時段所需的寫入數(shù)量。Node成為這個問題的解決方案的重要一環(huán)。如您所見,Node能處理數(shù)萬條入站tweet。它能快速而又輕松地將它們寫入一個內(nèi)存排隊機制〔例如memcached〕,另一個單獨進程可以從那里將它們寫入數(shù)據(jù)庫。Node在這里的角色是迅速收集tweet,并將這個信息傳遞給另一個負責寫入的進程。想象一下另一種設(shè)計〔常規(guī)PHP服務(wù)器會自己嘗試處理對數(shù)據(jù)庫本身的寫入〕:每個tweet都會在寫入數(shù)據(jù)庫時導致一個短暫的延遲,因為數(shù)據(jù)庫調(diào)用正在阻塞通道。由于數(shù)據(jù)庫延遲,一臺這樣設(shè)計的機器每秒可能只能處理2000條入站tweet。每秒處理100萬條tweet則需要500個服務(wù)器。相反,Node能處理每個連接而不會阻塞通道,從而能夠捕獲盡可能多的tweets。一個能處理50,000條tweet的Node機器僅需20臺服務(wù)器即可。電子游戲統(tǒng)計數(shù)據(jù)如果您在線玩過《使命召喚》這款游戲,當您查看游戲統(tǒng)計數(shù)據(jù)時,就會立即意識到一個問題:要生成那種級別的統(tǒng)計數(shù)據(jù),必須跟蹤海量信息。這樣,如果有數(shù)百萬玩家同時在線玩游戲,而且他們處于游戲中的不同位置,那么很快就會生成海量信息。Node是這種場景的一種很好的解決方案,因為它能采集游戲生成的數(shù)據(jù),對數(shù)據(jù)進展最少的合并,然后對數(shù)據(jù)進展排隊,以便將它們寫入數(shù)據(jù)庫。使用整個服務(wù)器來跟蹤玩家在游戲中發(fā)射了多少子彈看起來很愚蠢,如果您使用Apache這樣的服務(wù)器,可能會有一些有用的限制;但相反,如果您專門使用一個服務(wù)器來跟蹤一個游戲的所有統(tǒng)計數(shù)據(jù),就像使用運行Node的服務(wù)器所做的那樣,那看起來似乎是一種明智之舉。映像文件服務(wù)器一個擁有大型分布式網(wǎng)站的公司〔比方Facebook或Flickr〕可能會決定將所有機器只用于服務(wù)映像。Node將是這個問題的一個不錯的解決方案,因為該公司能使用它編寫一個簡單的文件檢索器,然后處理數(shù)萬條連接。Node將查找映像文件,返回文件或一個404錯誤,然后什么也不用做。這種設(shè)置將允許這類分布式網(wǎng)站減少它們服務(wù)映像、.js和.css文件等靜態(tài)文件所需的服務(wù)器數(shù)量。下面答復一些對于node.js和舊知識的一些問題1服務(wù)端JS的實現(xiàn),和我們傳統(tǒng)的服務(wù)端實現(xiàn)相比,優(yōu)勢在哪里呢答:從幾個方面看1、和傳統(tǒng)的服務(wù)端腳本語言,原生的非阻塞io,能夠很大程度上提高并發(fā)負載能力2、對于java,c等直接開發(fā)的非阻塞服務(wù),在開發(fā)效率和本錢上要更勝出.3、從語言特性上講,js語言本身對事件機制由很好的支持,2node.js的開發(fā)效率和本錢,具體表達在哪呢答:1、java的nio實現(xiàn)代碼量要比node多出很多,c的就要更多,而且debug起來比擬復雜。2、相對ruby等語言,node在執(zhí)行效率上又勝出不少,而且node無協(xié)程個人覺得是比擬好的選擇。有了這些相信您對node.js已經(jīng)有了極大的興趣,下面我們來到node.js使用的第一步:安裝node.js和命令使用篇:1Node.js的安裝和控制臺命令Windows系統(tǒng)的node.js安裝非常簡單,只需在官方網(wǎng)站上下載windows的安裝包——一個.msi文件,雙擊安裝就可以了,由于安裝較為簡單,在此不做描述。這里需要注意的就是,我曾經(jīng)在裝完之后去找快捷方式,結(jié)果什么都沒找到,安裝時也沒有指定node.js安裝到了哪里,不過根據(jù)平時對windows的了解,很快在C:\ProgramFiles(x86)這個文件夾里找到了nodejs文件夾〔注:本人是64位windows7系統(tǒng)〕,而且環(huán)境變量默認是已經(jīng)配好了的。此時我們翻開命令行窗口,發(fā)現(xiàn)輸入node時不顯示沒有此命令提示了,說明我們已經(jīng)安裝好了。當翻開NodeJS文件夾的時候,您會發(fā)現(xiàn)有幾個東西不知道是干什么用的,在此先說明一下,node_modules里裝的是NodeJS的模塊,而nodejs的核心魅力都在這里面。而npm是用來管理模塊的,如果您對linux有所了解,對npm也一定不會陌生?,F(xiàn)在您所學的javascript知識都將派上用場,因為node.js使用的就是V8引擎,在這里我們就可以跑javascript代碼了。為數(shù)不多的控制臺命令可以用.help命令找到現(xiàn)在萬事俱備,我們可以開場node.js之旅了。2架一個服務(wù)上回說道:在Windows平臺,node.js可以精簡到一個可執(zhí)行文件,運行這個文件,我們就得到了一個控制臺,在這個控制臺,我們可以以REPL(Read-Eval-Print-Loop)的方式交互的執(zhí)行js代碼。一、批量執(zhí)行代碼現(xiàn)在面臨的一個問題是:如何批量執(zhí)行js代碼呢答復是:可以將js代碼放進一個文件,然后鍵入如下命令此時已經(jīng)說明我們的.js程序運行成功了!??!二、前端呢還是后端這是個問題。我們知道,Javascript就是依靠瀏覽器的,沒有瀏覽器它什么都不是所以,估計您和我一樣,第一次接觸到Node.js時,會誤以為是一個新的前端框架。但事實是:Node.js目的是為了建設(shè)服務(wù)器端應(yīng)用的。在以后我們會完成搭建聊天室等任務(wù),而且都是用很簡單的代碼完成,完全不用什么web服務(wù)器或者高級語言,相信完成之后nodejs會讓您刮目相看。三、模塊模塊剛上大學時學C語言的時候大家都知道,沒有include<stdio.h>,連最簡單的helloworld都沒法做。任何語言,失去了強大類庫的支持都是弱弱的任何成熟的語言,都是采用把強大的功能打包成類庫的方式,實現(xiàn)語言的高擴展的。之所以很多人感覺javascript有一種神秘色彩或者感覺它功能有很大的局限性,就是因為缺少強大的類庫。所以,一幫IT牛人開場考慮解決這個問題了,這個工程就是CommonJS。CommonJS希望實現(xiàn)一個Javascript標準類庫,使開發(fā)者能夠利用Javascirpt來開發(fā)以下類型的應(yīng)用:

1、服務(wù)器端應(yīng)用;

2、命令行工具;

3、桌面基于GUI應(yīng)用

4、混合應(yīng)用〔Titanium,AdobeAIR〕

node.js是Common.JS的實現(xiàn)者之一。這時我們該了解一個重要的函數(shù)了——require函數(shù)。使用這個函數(shù)來引入別的模塊,通俗點說它類似于include(C)、import(JAVA)。比方,node.js內(nèi)置了個模塊,專門幫助我們實現(xiàn)服務(wù)。我們只需要:var=require(‘’);就可以開場使用該模塊的功能了,目前就本人所知node.js官網(wǎng)現(xiàn)在已經(jīng)注冊了5747個第三方模塊。安裝這些模塊也非常的簡單,不過,還是先來完成第一個吧。四、服務(wù)之HelloWorld我們只用幾行代碼就可以實現(xiàn)一個服務(wù),先不要驚訝,見如下代碼然后保存成app.js文件,并用:nodeapp.js運行。然后可以用瀏覽器訪問了,地址是:://localhost:888。因為默認的80端口可能會有沖突,所以在這里我們使用了888端口。但是我們發(fā)現(xiàn)沒有任何效果,這是因為:.createServer其實是可以帶參數(shù)的,而在這里我們省略了參數(shù),.createServer的參數(shù)應(yīng)該是一個函數(shù)。這個函數(shù)在每次有請求進來的時候就會跑一遍,也就是說,我們每用瀏覽器訪問一次上面的地址,我們傳進去的函數(shù)就運行一遍。下面我們再修改代碼:好,現(xiàn)在再訪問試試。瀏覽器還是什么都沒有。不過,每次我們刷新瀏覽器,后臺都會告訴我們訪問進來了。就這樣,一個服務(wù)架成了,下一篇我們將完成一個helloworld3完成HelloWorld剛剛我們用node.js快速而方便的搭建了一個服務(wù)器,現(xiàn)在我們要把helloworld發(fā)送出去。大家知道,我們的Web應(yīng)用抽象起來就是客戶端發(fā)出請求request,請求到達服務(wù)器后,服務(wù)器給客戶端發(fā)回一個應(yīng)答response。服務(wù)器和客戶端之間交流的語言就是協(xié)議??傊趙eb應(yīng)用中的兩個至關(guān)重要的東西就是request和response。 上一篇我們說到,每次有訪問,我們的函數(shù)都會運行一次,所以只要把request和response作為參數(shù)傳遞給tellme函數(shù),然后當請求到達時,node.js就會把客戶的請求封裝成request,預備發(fā)給客戶的應(yīng)答封裝成response。我們拿到request,看看他請求些什么,再把一些東西〔如讀出個文件或去查數(shù)據(jù)庫〕封裝進進response,發(fā)給客戶端。代碼如下:運行他,再用瀏覽器訪問他。在瀏覽器得到了“Helloworld!〞,再看看服務(wù)器的控制臺這一大串的就是Request了,它使用的是json格式,觀察request對象,我們可以找到一些我們熟悉的東西。比方:request.url、request.method、比方headers,可以簡化一下后臺:后臺的顯示內(nèi)容一目了然。至此HelloWorld例如完畢,下一節(jié)是利用nodejs創(chuàng)立一個支持靜態(tài)頁面的web服務(wù)器。4搭建一個靜態(tài)的web服務(wù)器如果想深入了解某個對象,可以在repl環(huán)境下,把這個對象打印出來。例如引入的模塊,可以repl提示符下鍵入:noderequire(‘’)然后回車,會出現(xiàn)由此可見狀態(tài)代碼無需看文檔即可查看。下面開場正題,搭建一個支持靜態(tài)頁面的web服務(wù)器一讀寫文件為了完成搭建靜態(tài)服務(wù)器,我們需要引入文件I/O,node.js內(nèi)置了fs模塊,引入就可以讀寫文件了。請按以下方式組織目錄:Webserver|_____app.js|_____root|_____index.htm這里root文件夾就是存放頁面的地方,稍懂一點web服務(wù)器的都很容易明白,這里不多做解釋。一會我們要把內(nèi)容從文件里讀出來,顯示在控制臺并發(fā)送給瀏覽器。在寫代碼之前,我們先用前面的方法查看fs模塊:fs里方法有很多?,F(xiàn)在我們需要去查官網(wǎng)文檔,我們就用fs.readFile方法。測試該方法的代碼建議您自己先寫一個,能更方便您了解和學習,本節(jié)代碼如下:注:__dirname是兩個下劃線__!!!二、分析請求路徑我們已經(jīng)實現(xiàn)了讀取文本文件,并送到客戶端瀏覽器的工作。但是讀取的文件名是硬編碼在代碼里的。現(xiàn)在我們需要讓用戶來指定他需要什么文件,然后讀出來給發(fā)過去。而用戶指定的路徑和文件名這個信息是通過request傳過來的,request的眾多的屬性里,有一個為url屬性,以前我們都是通過url來映射文件的路徑的。不過到了現(xiàn)在MVC和REST時代,情況開場變得有些復雜,這里暫且不提。解釋代碼之前,我們先砍一下url,一條url一般可以分成主機地址、路徑和鍵值對,如圖:我們嘗試引入url模塊,用這個工具來解析了一串例如,得到一個對象。其中pathname就是我們要的,不過現(xiàn)在我們需要將它映射為我們服務(wù)器端的絕對地址,代碼如下〔由于代碼較長,截圖不便,直接給出〕:var=require(''),fs=require('fs'),urlutil=require('url'),path=require('path');.createServer(function(request,response){//getpathfromrequest'surlvarurlpath=urlutil.parse(request.url).pathname;//mapthepathtoserverpathvarabsPath=__dirname+"/webroot"+urlpath;//testwhetherthefileisexistsfirstpath.exists(absPath,function(exists){if(exists){//ifokfs.readFile(absPath,function(err,data){//ourworkishereif(err)throwerr;console.log(data);response.write(data);response.end();});}else{//show404response.end('404Filenotfound.');}});}).listen(888);console.log('Serverstartinport888.');至此本節(jié)完畢,下一節(jié)的內(nèi)容是利用nodejs和socket.io實現(xiàn)websocket5Websocket的實現(xiàn)WebSocket是什么百度百科上說WebSocket標準的目標是在瀏覽器中實現(xiàn)和服務(wù)器端雙向通信.雙向通信可以拓展瀏覽器上的應(yīng)用類型,例如實時的數(shù)據(jù)推送(股票行情),游戲,聊天/im等,而且websocket實現(xiàn)的是全雙工通信。與傳統(tǒng)的相比,它的優(yōu)點是什么雙向全雙工,持續(xù)連接,實時、事件驅(qū)動,低帶寬消耗,文檔、二進制均可,客戶端不局限于瀏覽器。WebSocket能干什么理論上,socket能干什么,他就能干什么想要再具體了解websocket,請參見websocket官網(wǎng)。WebSocket協(xié)議與Socket.IO模塊Node.js的第三方模塊Socket.Io(詳見socket.io官網(wǎng))提供在Node.js上使用WebSocket協(xié)議的能力,我們需要安裝socket.io,由于我們最后目的是要建設(shè)一個聊天室,所以我們先建一個文件夾,取名為chatroom,翻開命令行窗口,移步到chatroom目錄下,鍵入如下命令:D:\chatroom>npminstallsocket.io–d由于我已經(jīng)安裝完成,這里不給出安裝過程圖了。準備工作完成后,我們還是先寫一個最最最簡的架子,然后測試,代碼如下:如果見到如以以下圖,則說明運行成功現(xiàn)在我們可以說已經(jīng)實現(xiàn)了一個websocket了,下一節(jié)我們將利用websocket搭建一個聊天室。6利用Websocket實現(xiàn)聊天室剛剛我們成功的實現(xiàn)了websocket,下面進入最沖動的局部,實現(xiàn)聊天室:在chatroom文件夾下建一個chatClient.htm,代碼如下:<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"":///TR/html4/loose.dtd"><html><head><title>ChatClient</title><scriptsrc="/socket.io/socket.io.js"></script><scripttype="text/javascript"> varsocket=io.connect('://localhost:888'); socket.on('usermessage',function(msg){ msgbox(msg.msg); }); functionsendMsg(){ varinpt=document.getElementById('txtInput'); varstr=inpt.value; msgbox(str); //sendtoserver socket.emit('msg',{msg:str}); console.log('[client]'+str); inpt.value=""; inpt.focus(); } functionmsgbox(str){ varbox=document.getElementById('box'); box.innerHTML+=str+'<br>'; }</script><styletype="text/css"> #box{ overflow:auto; width:500px;height:300px;border:1pxsolid#dcdcdc; } #txtInput{ width:430px; }</style></head><body> <h2>ChatClient</h2> <divid='box'></div> <inputtype='text'id='txtInput'><inputtype='button'value='SEND'onclick='sendMsg();'></body></html>運行服務(wù)器端app.js文件,然后,用瀏覽器翻開chatroom.htm文件,觀察服務(wù)器控制臺:此時顯示websocket已經(jīng)連接成功?。×奶焓掖罱ㄍ瓿?。這時我們再翻開兩個瀏覽器窗口訪問:localhost:888就可以互相通信啦,至此聊天室搭建成功,本節(jié)完畢。7websocket與jquery的結(jié)合flash中有一個shareobject,可以讓大家通過網(wǎng)絡(luò)共享一個對象。曾經(jīng)有個例如,就是甲拖動屏幕上的小球,乙的屏幕上的小球也同樣被拖動了,乙也同樣可以拖動的動作共享給甲。完成這樣的功能需要FlashMediaServer,不過利用前面我們的nodejs,我們已經(jīng)可以實現(xiàn)這個案例了而且不用插件。js代碼如下:頁面html代碼如下:<html> <head> <title>ShareObject</title> <scriptsrc="/socket.io/socket.io.js"></script> <linkhref="://ajax.googleapis/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"rel="stylesheet"type="text/css"/> <scriptsrc="://ajax.googleapis/ajax/libs/jquery/1.5/jquery.min.js"></script> <scriptsrc="://ajax.googleapis/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> <s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論