版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
...wd......wd......wd...成都信息工程學院Node.js的安裝使用及例如周星2012/7/5本文檔分為介紹篇和使用篇,介紹篇關于node.js的介紹、應用及前景等;使用篇包括node.js安裝和命令、架起一個服務、完成一個〞hello,world〞、搭建一個只支持靜態(tài)網頁的web服務器、使node.js和socket.io實現websocket,搭建小型聊天室、node.js和jquery的結合,通過本文檔初學者可以很快了解node.js及其使用方法,當然本文檔只是一個簡要概括,更多的功能需要您深入去探究。有幾個新概念需要您了解:V8引擎、Rest、服務器javascript。目錄介紹篇:2什么是node.js2Node.js的適用場景2Node旨在解決什么問題2ESTfulAPI3Twitter隊列3電子游戲統(tǒng)計數據3映像文件服務器3下面答復一些對于node.js和舊知識的一些問題41服務端JS的實現,和我們傳統(tǒng)的服務端實現相比,優(yōu)勢在哪里呢42node.js的開發(fā)效率和本錢,具體表達在哪呢4使用篇:41Node.js的安裝和控制臺命令42架一個服務6一、批量執(zhí)行代碼6二、前端呢還是后端這是個問題。6三、模塊模塊7四、服務之HelloWorld73完成HelloWorld94搭建一個靜態(tài)的web服務器11一讀寫文件11二、分析請求路徑125Websocket的實現15一、WebSocket是什么15二、與傳統(tǒng)的相比,它的優(yōu)點是什么15三、WebSocket能干什么15四、WebSocket協(xié)議與Socket.IO模塊156利用Websocket實現聊天室177websocket與jquery的結合19完畢語21介紹篇:什么是node.js在介紹node.js之前,我們首先了解一下node.js的重要性,看看都有誰在用它。微軟的云服務Azure已經開場支持Node.js、還有就是Ebay、Yahoo、Linkedin,這些IT界的大佬都在用,node.js未來肯定是光明的。下面再說什么是node.js,node.js的官方網站這樣自我描述:Node.jsisaplatformbuiltonChrome'sJavaScriptruntimeforeasilybuildingfast,scalablenetworkapplications.Node.jsusesanevent-driven,non-blockingI/Omodelthatmakesitlightweightandefficient,perfectfordata-intensivereal-timeapplicationsthatrunacrossdistributeddevices.翻譯過來就是:Node.js是一個平臺,建設在ChromeJavaScript運行時之上,目的是建設快速、可伸縮的網絡應用。Node.js使用事件驅動,非阻塞的I/O模式,這使得他是輕量而高效的,能夠在分布設備上完美運行高數據吞吐的實時應用。如果還想深入了解,可能還需要您去了解一下google的V8引擎。介紹到此為止,下面我們來看一下node.js的適用場景。Node.js的適用場景Node旨在解決什么問題Node公開宣稱的目標是“旨在提供一種簡單的構建可伸縮網絡程序的方法〞。當前的服務器程序有什么問題我們來做個數學題。在Java?和PHP這類語言中,每個連接都會生成一個新線程,每個新線程可能需要2MB配套內存。在一個擁有8GBRAM的系統(tǒng)上,理論上最大的并發(fā)連接數量是4,000個用戶。隨著您的客戶端根基的增長,您希望您的web應用程序支持更多用戶,這樣,您必須添加更多服務器。當然,這會增加業(yè)務本錢,尤其是服務器本錢、運輸本錢和人工本錢。除這些本錢上升外,還有一個技術問題:用戶可能針對每個請求使用不同的服務器,因此,任何共享資源都必須在所有服務器之間共享。例如,在Java中,靜態(tài)變量和緩存需要在每個服務器上的JVMs之間共享。這就是整個web應用程序架構中的瓶頸:一個服務器能夠處理的并發(fā)連接的最大數量。Node解決這個問題的方法是:更改連接連接到服務器的方式。每個連接都創(chuàng)立一個進程,該進程不需要配套內存塊,而不是為每個連接生成一個新的OS線程〔并向其分配一些配套內存〕。Node聲稱它絕不會死鎖,因為它根本不允許使用鎖,它不會直接阻塞I/O調用。Node還宣稱,運行它的服務器能支持數萬個并發(fā)連接。事實上,Node通過將整個系統(tǒng)中的瓶頸從最大連接數量更改到單個系統(tǒng)的流量來改變服務器面貌。ESTfulAPI提供RestfulAPI的Web服務接收幾個參數,解析它們,組合一個響應,并返回一個響應〔通常是較少的文本〕給用戶。這是適合Node的理想情況,因為您可以構建它來處理數萬條連接。它仍然不需要大量邏輯;它本質上只是從某個數據庫中查找一些值并將它們組成一個響應。由于響應是少量文本,入站請求也是少量的文本,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求。Twitter隊列想像一下像Twitter這樣的公司,它必須接收tweets并將其寫入數據庫。實際上,每秒幾乎有數千條tweet到達,數據庫不可能及時處理頂峰時段所需的寫入數量。Node成為這個問題的解決方案的重要一環(huán)。如您所見,Node能處理數萬條入站tweet。它能快速而又輕松地將它們寫入一個內存排隊機制〔例如memcached〕,另一個單獨進程可以從那里將它們寫入數據庫。Node在這里的角色是迅速收集tweet,并將這個信息傳遞給另一個負責寫入的進程。想象一下另一種設計〔常規(guī)PHP服務器會自己嘗試處理對數據庫本身的寫入〕:每個tweet都會在寫入數據庫時導致一個短暫的延遲,因為數據庫調用正在阻塞通道。由于數據庫延遲,一臺這樣設計的機器每秒可能只能處理2000條入站tweet。每秒處理100萬條tweet則需要500個服務器。相反,Node能處理每個連接而不會阻塞通道,從而能夠捕獲盡可能多的tweets。一個能處理50,000條tweet的Node機器僅需20臺服務器即可。電子游戲統(tǒng)計數據如果您在線玩過《使命召喚》這款游戲,當您查看游戲統(tǒng)計數據時,就會立即意識到一個問題:要生成那種級別的統(tǒng)計數據,必須跟蹤海量信息。這樣,如果有數百萬玩家同時在線玩游戲,而且他們處于游戲中的不同位置,那么很快就會生成海量信息。Node是這種場景的一種很好的解決方案,因為它能采集游戲生成的數據,對數據進展最少的合并,然后對數據進展排隊,以便將它們寫入數據庫。使用整個服務器來跟蹤玩家在游戲中發(fā)射了多少子彈看起來很愚蠢,如果您使用Apache這樣的服務器,可能會有一些有用的限制;但相反,如果您專門使用一個服務器來跟蹤一個游戲的所有統(tǒng)計數據,就像使用運行Node的服務器所做的那樣,那看起來似乎是一種明智之舉。映像文件服務器一個擁有大型分布式網站的公司〔比方Facebook或Flickr〕可能會決定將所有機器只用于服務映像。Node將是這個問題的一個不錯的解決方案,因為該公司能使用它編寫一個簡單的文件檢索器,然后處理數萬條連接。Node將查找映像文件,返回文件或一個404錯誤,然后什么也不用做。這種設置將允許這類分布式網站減少它們服務映像、.js和.css文件等靜態(tài)文件所需的服務器數量。下面答復一些對于node.js和舊知識的一些問題1服務端JS的實現,和我們傳統(tǒng)的服務端實現相比,優(yōu)勢在哪里呢答:從幾個方面看1、和傳統(tǒng)的服務端腳本語言,原生的非阻塞io,能夠很大程度上提高并發(fā)負載能力2、對于java,c等直接開發(fā)的非阻塞服務,在開發(fā)效率和本錢上要更勝出.3、從語言特性上講,js語言本身對事件機制由很好的支持,2node.js的開發(fā)效率和本錢,具體表達在哪呢答:1、java的nio實現代碼量要比node多出很多,c的就要更多,而且debug起來比擬復雜。2、相對ruby等語言,node在執(zhí)行效率上又勝出不少,而且node無協(xié)程個人覺得是比擬好的選擇。有了這些相信您對node.js已經有了極大的興趣,下面我們來到node.js使用的第一步:安裝node.js和命令使用篇:1Node.js的安裝和控制臺命令Windows系統(tǒng)的node.js安裝非常簡單,只需在官方網站上下載windows的安裝包——一個.msi文件,雙擊安裝就可以了,由于安裝較為簡單,在此不做描述。這里需要注意的就是,我曾經在裝完之后去找快捷方式,結果什么都沒找到,安裝時也沒有指定node.js安裝到了哪里,不過根據平時對windows的了解,很快在C:\ProgramFiles(x86)這個文件夾里找到了nodejs文件夾〔注:本人是64位windows7系統(tǒng)〕,而且環(huán)境變量默認是已經配好了的。此時我們翻開命令行窗口,發(fā)現輸入node時不顯示沒有此命令提示了,說明我們已經安裝好了。當翻開NodeJS文件夾的時候,您會發(fā)現有幾個東西不知道是干什么用的,在此先說明一下,node_modules里裝的是NodeJS的模塊,而nodejs的核心魅力都在這里面。而npm是用來管理模塊的,如果您對linux有所了解,對npm也一定不會陌生。現在您所學的javascript知識都將派上用場,因為node.js使用的就是V8引擎,在這里我們就可以跑javascript代碼了。為數不多的控制臺命令可以用.help命令找到現在萬事俱備,我們可以開場node.js之旅了。2架一個服務上回說道:在Windows平臺,node.js可以精簡到一個可執(zhí)行文件,運行這個文件,我們就得到了一個控制臺,在這個控制臺,我們可以以REPL(Read-Eval-Print-Loop)的方式交互的執(zhí)行js代碼。一、批量執(zhí)行代碼現在面臨的一個問題是:如何批量執(zhí)行js代碼呢答復是:可以將js代碼放進一個文件,然后鍵入如下命令此時已經說明我們的.js程序運行成功了!?。《?、前端呢還是后端這是個問題。我們知道,Javascript就是依靠瀏覽器的,沒有瀏覽器它什么都不是所以,估計您和我一樣,第一次接觸到Node.js時,會誤以為是一個新的前端框架。但事實是:Node.js目的是為了建設服務器端應用的。在以后我們會完成搭建聊天室等任務,而且都是用很簡單的代碼完成,完全不用什么web服務器或者高級語言,相信完成之后nodejs會讓您刮目相看。三、模塊模塊剛上大學時學C語言的時候大家都知道,沒有include<stdio.h>,連最簡單的helloworld都沒法做。任何語言,失去了強大類庫的支持都是弱弱的任何成熟的語言,都是采用把強大的功能打包成類庫的方式,實現語言的高擴展的。之所以很多人感覺javascript有一種神秘色彩或者感覺它功能有很大的局限性,就是因為缺少強大的類庫。所以,一幫IT牛人開場考慮解決這個問題了,這個工程就是CommonJS。CommonJS希望實現一個Javascript標準類庫,使開發(fā)者能夠利用Javascirpt來開發(fā)以下類型的應用:
1、服務器端應用;
2、命令行工具;
3、桌面基于GUI應用
4、混合應用〔Titanium,AdobeAIR〕
node.js是Common.JS的實現者之一。這時我們該了解一個重要的函數了——require函數。使用這個函數來引入別的模塊,通俗點說它類似于include(C)、import(JAVA)。比方,node.js內置了個模塊,專門幫助我們實現服務。我們只需要:var=require(‘’);就可以開場使用該模塊的功能了,目前就本人所知node.js官網現在已經注冊了5747個第三方模塊。安裝這些模塊也非常的簡單,不過,還是先來完成第一個吧。四、服務之HelloWorld我們只用幾行代碼就可以實現一個服務,先不要驚訝,見如下代碼然后保存成app.js文件,并用:nodeapp.js運行。然后可以用瀏覽器訪問了,地址是:://localhost:888。因為默認的80端口可能會有沖突,所以在這里我們使用了888端口。但是我們發(fā)現沒有任何效果,這是因為:.createServer其實是可以帶參數的,而在這里我們省略了參數,.createServer的參數應該是一個函數。這個函數在每次有請求進來的時候就會跑一遍,也就是說,我們每用瀏覽器訪問一次上面的地址,我們傳進去的函數就運行一遍。下面我們再修改代碼:好,現在再訪問試試。瀏覽器還是什么都沒有。不過,每次我們刷新瀏覽器,后臺都會告訴我們訪問進來了。就這樣,一個服務架成了,下一篇我們將完成一個helloworld3完成HelloWorld剛剛我們用node.js快速而方便的搭建了一個服務器,現在我們要把helloworld發(fā)送出去。大家知道,我們的Web應用抽象起來就是客戶端發(fā)出請求request,請求到達服務器后,服務器給客戶端發(fā)回一個應答response。服務器和客戶端之間交流的語言就是協(xié)議。總之在web應用中的兩個至關重要的東西就是request和response。 上一篇我們說到,每次有訪問,我們的函數都會運行一次,所以只要把request和response作為參數傳遞給tellme函數,然后當請求到達時,node.js就會把客戶的請求封裝成request,預備發(fā)給客戶的應答封裝成response。我們拿到request,看看他請求些什么,再把一些東西〔如讀出個文件或去查數據庫〕封裝進進response,發(fā)給客戶端。代碼如下:運行他,再用瀏覽器訪問他。在瀏覽器得到了“Helloworld!〞,再看看服務器的控制臺這一大串的就是Request了,它使用的是json格式,觀察request對象,我們可以找到一些我們熟悉的東西。比方:request.url、request.method、比方headers,可以簡化一下后臺:后臺的顯示內容一目了然。至此HelloWorld例如完畢,下一節(jié)是利用nodejs創(chuàng)立一個支持靜態(tài)頁面的web服務器。4搭建一個靜態(tài)的web服務器如果想深入了解某個對象,可以在repl環(huán)境下,把這個對象打印出來。例如引入的模塊,可以repl提示符下鍵入:noderequire(‘’)然后回車,會出現由此可見狀態(tài)代碼無需看文檔即可查看。下面開場正題,搭建一個支持靜態(tài)頁面的web服務器一讀寫文件為了完成搭建靜態(tài)服務器,我們需要引入文件I/O,node.js內置了fs模塊,引入就可以讀寫文件了。請按以下方式組織目錄:Webserver|_____app.js|_____root|_____index.htm這里root文件夾就是存放頁面的地方,稍懂一點web服務器的都很容易明白,這里不多做解釋。一會我們要把內容從文件里讀出來,顯示在控制臺并發(fā)送給瀏覽器。在寫代碼之前,我們先用前面的方法查看fs模塊:fs里方法有很多。現在我們需要去查官網文檔,我們就用fs.readFile方法。測試該方法的代碼建議您自己先寫一個,能更方便您了解和學習,本節(jié)代碼如下:注:__dirname是兩個下劃線__!!!二、分析請求路徑我們已經實現了讀取文本文件,并送到客戶端瀏覽器的工作。但是讀取的文件名是硬編碼在代碼里的?,F在我們需要讓用戶來指定他需要什么文件,然后讀出來給發(fā)過去。而用戶指定的路徑和文件名這個信息是通過request傳過來的,request的眾多的屬性里,有一個為url屬性,以前我們都是通過url來映射文件的路徑的。不過到了現在MVC和REST時代,情況開場變得有些復雜,這里暫且不提。解釋代碼之前,我們先砍一下url,一條url一般可以分成主機地址、路徑和鍵值對,如圖:我們嘗試引入url模塊,用這個工具來解析了一串例如,得到一個對象。其中pathname就是我們要的,不過現在我們需要將它映射為我們服務器端的絕對地址,代碼如下〔由于代碼較長,截圖不便,直接給出〕: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é)的內容是利用nodejs和socket.io實現websocket5Websocket的實現WebSocket是什么百度百科上說WebSocket標準的目標是在瀏覽器中實現和服務器端雙向通信.雙向通信可以拓展瀏覽器上的應用類型,例如實時的數據推送(股票行情),游戲,聊天/im等,而且websocket實現的是全雙工通信。與傳統(tǒng)的相比,它的優(yōu)點是什么雙向全雙工,持續(xù)連接,實時、事件驅動,低帶寬消耗,文檔、二進制均可,客戶端不局限于瀏覽器。WebSocket能干什么理論上,socket能干什么,他就能干什么想要再具體了解websocket,請參見websocket官網。WebSocket協(xié)議與Socket.IO模塊Node.js的第三方模塊Socket.Io(詳見socket.io官網)提供在Node.js上使用WebSocket協(xié)議的能力,我們需要安裝socket.io,由于我們最后目的是要建設一個聊天室,所以我們先建一個文件夾,取名為chatroom,翻開命令行窗口,移步到chatroom目錄下,鍵入如下命令:D:\chatroom>npminstallsocket.io–d由于我已經安裝完成,這里不給出安裝過程圖了。準備工作完成后,我們還是先寫一個最最最簡的架子,然后測試,代碼如下:如果見到如以以下圖,則說明運行成功現在我們可以說已經實現了一個websocket了,下一節(jié)我們將利用websocket搭建一個聊天室。6利用Websocket實現聊天室剛剛我們成功的實現了websocket,下面進入最沖動的局部,實現聊天室:在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>運行服務器端app.js文件,然后,用瀏覽器翻開chatroom.htm文件,觀察服務器控制臺:此時顯示websocket已經連接成功?。×奶焓掖罱ㄍ瓿?。這時我們再翻開兩個瀏覽器窗口訪問:localhost:888就可以互相通信啦,至此聊天室搭建成功,本節(jié)完畢。7websocket與jquery的結合flash中有一個shareobject,可以讓大家通過網絡共享一個對象。曾經有個例如,就是甲拖動屏幕上的小球,乙的屏幕上的小球也同樣被拖動了,乙也同樣可以拖動的動作共享給甲。完成這樣的功能需要FlashMediaServer,不過利用前面我們的nodejs,我們已經可以實現這個案例了而且不用插件。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 拳擊手套市場需求與消費特點分析
- 2024年度水電站買賣協(xié)議范本
- 黑河土石壩施工課程設計
- 石油化工授權委托書辦法
- 農貿市場供熱管理細則
- 電視廣播用章節(jié)目規(guī)定
- 林業(yè)木材運輸司機招聘合同
- 家電賣場前臺聘用合同模板
- 冷凍海鮮捕撈作業(yè)環(huán)境保護
- 餐飲服務變更索賠處理方法
- 一次性付款房屋買賣合同
- 酒店財務管理制度之資產管理
- 變配電所綜合自動化系統(tǒng)講義
- 組織行為學案例分析 組織行為學案例分析
- 超聲內鏡培訓課件
- 重大事故隱患數據表
- 供應鏈管理(第3版)高職PPT完整全套教學課件
- 急性扁桃體炎病人的護理
- 渠道管理就這樣做
- 水電站大壩安全管理實績評價規(guī)程
- 07項目部事故隱患排查清單
評論
0/150
提交評論