版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
...wd......wd......wd...成都信息工程學(xué)院Node.js的安裝使用及例如周星2012/7/5本文檔分為介紹篇和使用篇,介紹篇關(guān)于node.js的介紹、應(yīng)用及前景等;使用篇包括node.js安裝和命令、架起一個(gè)服務(wù)、完成一個(gè)〞hello,world〞、搭建一個(gè)只支持靜態(tài)網(wǎng)頁(yè)的web服務(wù)器、使node.js和socket.io實(shí)現(xiàn)websocket,搭建小型聊天室、node.js和jquery的結(jié)合,通過(guò)本文檔初學(xué)者可以很快了解node.js及其使用方法,當(dāng)然本文檔只是一個(gè)簡(jiǎn)要概括,更多的功能需要您深入去探究。有幾個(gè)新概念需要您了解:V8引擎、Rest、服務(wù)器javascript。目錄介紹篇:2什么是node.js2Node.js的適用場(chǎng)景2Node旨在解決什么問(wèn)題2ESTfulAPI3Twitter隊(duì)列3電子游戲統(tǒng)計(jì)數(shù)據(jù)3映像文件服務(wù)器3下面答復(fù)一些對(duì)于node.js和舊知識(shí)的一些問(wèn)題41服務(wù)端JS的實(shí)現(xiàn),和我們傳統(tǒng)的服務(wù)端實(shí)現(xiàn)相比,優(yōu)勢(shì)在哪里呢42node.js的開(kāi)發(fā)效率和本錢(qián),具體表達(dá)在哪呢4使用篇:41Node.js的安裝和控制臺(tái)命令42架一個(gè)服務(wù)6一、批量執(zhí)行代碼6二、前端呢還是后端這是個(gè)問(wèn)題。6三、模塊模塊7四、服務(wù)之HelloWorld73完成HelloWorld94搭建一個(gè)靜態(tài)的web服務(wù)器11一讀寫(xiě)文件11二、分析請(qǐng)求路徑125Websocket的實(shí)現(xiàn)15一、WebSocket是什么15二、與傳統(tǒng)的相比,它的優(yōu)點(diǎn)是什么15三、WebSocket能干什么15四、WebSocket協(xié)議與Socket.IO模塊156利用Websocket實(shí)現(xiàn)聊天室177websocket與jquery的結(jié)合19完畢語(yǔ)21介紹篇:什么是node.js在介紹node.js之前,我們首先了解一下node.js的重要性,看看都有誰(shuí)在用它。微軟的云服務(wù)Azure已經(jīng)開(kāi)場(chǎng)支持Node.js、還有就是Ebay、Yahoo、Linkedin,這些IT界的大佬都在用,node.js未來(lái)肯定是光明的。下面再說(shuō)什么是node.js,node.js的官方網(wǎng)站這樣自我描述:Node.jsisaplatformbuiltonChrome'sJavaScriptruntimeforeasilybuildingfast,scalablenetworkapplications.Node.jsusesanevent-driven,non-blockingI/Omodelthatmakesitlightweightandefficient,perfectfordata-intensivereal-timeapplicationsthatrunacrossdistributeddevices.翻譯過(guò)來(lái)就是:Node.js是一個(gè)平臺(tái),建設(shè)在ChromeJavaScript運(yùn)行時(shí)之上,目的是建設(shè)快速、可伸縮的網(wǎng)絡(luò)應(yīng)用。Node.js使用事件驅(qū)動(dòng),非阻塞的I/O模式,這使得他是輕量而高效的,能夠在分布設(shè)備上完美運(yùn)行高數(shù)據(jù)吞吐的實(shí)時(shí)應(yīng)用。如果還想深入了解,可能還需要您去了解一下google的V8引擎。介紹到此為止,下面我們來(lái)看一下node.js的適用場(chǎng)景。Node.js的適用場(chǎng)景Node旨在解決什么問(wèn)題Node公開(kāi)宣稱的目標(biāo)是“旨在提供一種簡(jiǎn)單的構(gòu)建可伸縮網(wǎng)絡(luò)程序的方法〞。當(dāng)前的服務(wù)器程序有什么問(wèn)題我們來(lái)做個(gè)數(shù)學(xué)題。在Java?和PHP這類語(yǔ)言中,每個(gè)連接都會(huì)生成一個(gè)新線程,每個(gè)新線程可能需要2MB配套內(nèi)存。在一個(gè)擁有8GBRAM的系統(tǒng)上,理論上最大的并發(fā)連接數(shù)量是4,000個(gè)用戶。隨著您的客戶端根基的增長(zhǎng),您希望您的web應(yīng)用程序支持更多用戶,這樣,您必須添加更多服務(wù)器。當(dāng)然,這會(huì)增加業(yè)務(wù)本錢(qián),尤其是服務(wù)器本錢(qián)、運(yùn)輸本錢(qián)和人工本錢(qián)。除這些本錢(qián)上升外,還有一個(gè)技術(shù)問(wèn)題:用戶可能針對(duì)每個(gè)請(qǐng)求使用不同的服務(wù)器,因此,任何共享資源都必須在所有服務(wù)器之間共享。例如,在Java中,靜態(tài)變量和緩存需要在每個(gè)服務(wù)器上的JVMs之間共享。這就是整個(gè)web應(yīng)用程序架構(gòu)中的瓶頸:一個(gè)服務(wù)器能夠處理的并發(fā)連接的最大數(shù)量。Node解決這個(gè)問(wèn)題的方法是:更改連接連接到服務(wù)器的方式。每個(gè)連接都創(chuàng)立一個(gè)進(jìn)程,該進(jìn)程不需要配套內(nèi)存塊,而不是為每個(gè)連接生成一個(gè)新的OS線程〔并向其分配一些配套內(nèi)存〕。Node聲稱它絕不會(huì)死鎖,因?yàn)樗静辉试S使用鎖,它不會(huì)直接阻塞I/O調(diào)用。Node還宣稱,運(yùn)行它的服務(wù)器能支持?jǐn)?shù)萬(wàn)個(gè)并發(fā)連接。事實(shí)上,Node通過(guò)將整個(gè)系統(tǒng)中的瓶頸從最大連接數(shù)量更改到單個(gè)系統(tǒng)的流量來(lái)改變服務(wù)器面貌。ESTfulAPI提供RestfulAPI的Web服務(wù)接收幾個(gè)參數(shù),解析它們,組合一個(gè)響應(yīng),并返回一個(gè)響應(yīng)〔通常是較少的文本〕給用戶。這是適合Node的理想情況,因?yàn)槟梢詷?gòu)建它來(lái)處理數(shù)萬(wàn)條連接。它仍然不需要大量邏輯;它本質(zhì)上只是從某個(gè)數(shù)據(jù)庫(kù)中查找一些值并將它們組成一個(gè)響應(yīng)。由于響應(yīng)是少量文本,入站請(qǐng)求也是少量的文本,因此流量不高,一臺(tái)機(jī)器甚至也可以處理最繁忙的公司的API需求。Twitter隊(duì)列想像一下像Twitter這樣的公司,它必須接收tweets并將其寫(xiě)入數(shù)據(jù)庫(kù)。實(shí)際上,每秒幾乎有數(shù)千條tweet到達(dá),數(shù)據(jù)庫(kù)不可能及時(shí)處理頂峰時(shí)段所需的寫(xiě)入數(shù)量。Node成為這個(gè)問(wèn)題的解決方案的重要一環(huán)。如您所見(jiàn),Node能處理數(shù)萬(wàn)條入站tweet。它能快速而又輕松地將它們寫(xiě)入一個(gè)內(nèi)存排隊(duì)機(jī)制〔例如memcached〕,另一個(gè)單獨(dú)進(jìn)程可以從那里將它們寫(xiě)入數(shù)據(jù)庫(kù)。Node在這里的角色是迅速收集tweet,并將這個(gè)信息傳遞給另一個(gè)負(fù)責(zé)寫(xiě)入的進(jìn)程。想象一下另一種設(shè)計(jì)〔常規(guī)PHP服務(wù)器會(huì)自己嘗試處理對(duì)數(shù)據(jù)庫(kù)本身的寫(xiě)入〕:每個(gè)tweet都會(huì)在寫(xiě)入數(shù)據(jù)庫(kù)時(shí)導(dǎo)致一個(gè)短暫的延遲,因?yàn)閿?shù)據(jù)庫(kù)調(diào)用正在阻塞通道。由于數(shù)據(jù)庫(kù)延遲,一臺(tái)這樣設(shè)計(jì)的機(jī)器每秒可能只能處理2000條入站tweet。每秒處理100萬(wàn)條tweet則需要500個(gè)服務(wù)器。相反,Node能處理每個(gè)連接而不會(huì)阻塞通道,從而能夠捕獲盡可能多的tweets。一個(gè)能處理50,000條tweet的Node機(jī)器僅需20臺(tái)服務(wù)器即可。電子游戲統(tǒng)計(jì)數(shù)據(jù)如果您在線玩過(guò)《使命召喚》這款游戲,當(dāng)您查看游戲統(tǒng)計(jì)數(shù)據(jù)時(shí),就會(huì)立即意識(shí)到一個(gè)問(wèn)題:要生成那種級(jí)別的統(tǒng)計(jì)數(shù)據(jù),必須跟蹤海量信息。這樣,如果有數(shù)百萬(wàn)玩家同時(shí)在線玩游戲,而且他們處于游戲中的不同位置,那么很快就會(huì)生成海量信息。Node是這種場(chǎng)景的一種很好的解決方案,因?yàn)樗懿杉螒蛏傻臄?shù)據(jù),對(duì)數(shù)據(jù)進(jìn)展最少的合并,然后對(duì)數(shù)據(jù)進(jìn)展排隊(duì),以便將它們寫(xiě)入數(shù)據(jù)庫(kù)。使用整個(gè)服務(wù)器來(lái)跟蹤玩家在游戲中發(fā)射了多少子彈看起來(lái)很愚蠢,如果您使用Apache這樣的服務(wù)器,可能會(huì)有一些有用的限制;但相反,如果您專門(mén)使用一個(gè)服務(wù)器來(lái)跟蹤一個(gè)游戲的所有統(tǒng)計(jì)數(shù)據(jù),就像使用運(yùn)行Node的服務(wù)器所做的那樣,那看起來(lái)似乎是一種明智之舉。映像文件服務(wù)器一個(gè)擁有大型分布式網(wǎng)站的公司〔比方Facebook或Flickr〕可能會(huì)決定將所有機(jī)器只用于服務(wù)映像。Node將是這個(gè)問(wèn)題的一個(gè)不錯(cuò)的解決方案,因?yàn)樵摴灸苁褂盟帉?xiě)一個(gè)簡(jiǎn)單的文件檢索器,然后處理數(shù)萬(wàn)條連接。Node將查找映像文件,返回文件或一個(gè)404錯(cuò)誤,然后什么也不用做。這種設(shè)置將允許這類分布式網(wǎng)站減少它們服務(wù)映像、.js和.css文件等靜態(tài)文件所需的服務(wù)器數(shù)量。下面答復(fù)一些對(duì)于node.js和舊知識(shí)的一些問(wèn)題1服務(wù)端JS的實(shí)現(xiàn),和我們傳統(tǒng)的服務(wù)端實(shí)現(xiàn)相比,優(yōu)勢(shì)在哪里呢答:從幾個(gè)方面看1、和傳統(tǒng)的服務(wù)端腳本語(yǔ)言,原生的非阻塞io,能夠很大程度上提高并發(fā)負(fù)載能力2、對(duì)于java,c等直接開(kāi)發(fā)的非阻塞服務(wù),在開(kāi)發(fā)效率和本錢(qián)上要更勝出.3、從語(yǔ)言特性上講,js語(yǔ)言本身對(duì)事件機(jī)制由很好的支持,2node.js的開(kāi)發(fā)效率和本錢(qián),具體表達(dá)在哪呢答:1、java的nio實(shí)現(xiàn)代碼量要比node多出很多,c的就要更多,而且debug起來(lái)比擬復(fù)雜。2、相對(duì)ruby等語(yǔ)言,node在執(zhí)行效率上又勝出不少,而且node無(wú)協(xié)程個(gè)人覺(jué)得是比擬好的選擇。有了這些相信您對(duì)node.js已經(jīng)有了極大的興趣,下面我們來(lái)到node.js使用的第一步:安裝node.js和命令使用篇:1Node.js的安裝和控制臺(tái)命令Windows系統(tǒng)的node.js安裝非常簡(jiǎn)單,只需在官方網(wǎng)站上下載windows的安裝包——一個(gè).msi文件,雙擊安裝就可以了,由于安裝較為簡(jiǎn)單,在此不做描述。這里需要注意的就是,我曾經(jīng)在裝完之后去找快捷方式,結(jié)果什么都沒(méi)找到,安裝時(shí)也沒(méi)有指定node.js安裝到了哪里,不過(guò)根據(jù)平時(shí)對(duì)windows的了解,很快在C:\ProgramFiles(x86)這個(gè)文件夾里找到了nodejs文件夾〔注:本人是64位windows7系統(tǒng)〕,而且環(huán)境變量默認(rèn)是已經(jīng)配好了的。此時(shí)我們翻開(kāi)命令行窗口,發(fā)現(xiàn)輸入node時(shí)不顯示沒(méi)有此命令提示了,說(shuō)明我們已經(jīng)安裝好了。當(dāng)翻開(kāi)NodeJS文件夾的時(shí)候,您會(huì)發(fā)現(xiàn)有幾個(gè)東西不知道是干什么用的,在此先說(shuō)明一下,node_modules里裝的是NodeJS的模塊,而nodejs的核心魅力都在這里面。而npm是用來(lái)管理模塊的,如果您對(duì)linux有所了解,對(duì)npm也一定不會(huì)陌生?,F(xiàn)在您所學(xué)的javascript知識(shí)都將派上用場(chǎng),因?yàn)閚ode.js使用的就是V8引擎,在這里我們就可以跑javascript代碼了。為數(shù)不多的控制臺(tái)命令可以用.help命令找到現(xiàn)在萬(wàn)事俱備,我們可以開(kāi)場(chǎng)node.js之旅了。2架一個(gè)服務(wù)上回說(shuō)道:在Windows平臺(tái),node.js可以精簡(jiǎn)到一個(gè)可執(zhí)行文件,運(yùn)行這個(gè)文件,我們就得到了一個(gè)控制臺(tái),在這個(gè)控制臺(tái),我們可以以REPL(Read-Eval-Print-Loop)的方式交互的執(zhí)行js代碼。一、批量執(zhí)行代碼現(xiàn)在面臨的一個(gè)問(wèn)題是:如何批量執(zhí)行js代碼呢答復(fù)是:可以將js代碼放進(jìn)一個(gè)文件,然后鍵入如下命令此時(shí)已經(jīng)說(shuō)明我們的.js程序運(yùn)行成功了!??!二、前端呢還是后端這是個(gè)問(wèn)題。我們知道,Javascript就是依靠瀏覽器的,沒(méi)有瀏覽器它什么都不是所以,估計(jì)您和我一樣,第一次接觸到Node.js時(shí),會(huì)誤以為是一個(gè)新的前端框架。但事實(shí)是:Node.js目的是為了建設(shè)服務(wù)器端應(yīng)用的。在以后我們會(huì)完成搭建聊天室等任務(wù),而且都是用很簡(jiǎn)單的代碼完成,完全不用什么web服務(wù)器或者高級(jí)語(yǔ)言,相信完成之后nodejs會(huì)讓您刮目相看。三、模塊模塊剛上大學(xué)時(shí)學(xué)C語(yǔ)言的時(shí)候大家都知道,沒(méi)有include<stdio.h>,連最簡(jiǎn)單的helloworld都沒(méi)法做。任何語(yǔ)言,失去了強(qiáng)大類庫(kù)的支持都是弱弱的任何成熟的語(yǔ)言,都是采用把強(qiáng)大的功能打包成類庫(kù)的方式,實(shí)現(xiàn)語(yǔ)言的高擴(kuò)展的。之所以很多人感覺(jué)javascript有一種神秘色彩或者感覺(jué)它功能有很大的局限性,就是因?yàn)槿鄙購(gòu)?qiáng)大的類庫(kù)。所以,一幫IT牛人開(kāi)場(chǎng)考慮解決這個(gè)問(wèn)題了,這個(gè)工程就是CommonJS。CommonJS希望實(shí)現(xiàn)一個(gè)Javascript標(biāo)準(zhǔn)類庫(kù),使開(kāi)發(fā)者能夠利用Javascirpt來(lái)開(kāi)發(fā)以下類型的應(yīng)用:
1、服務(wù)器端應(yīng)用;
2、命令行工具;
3、桌面基于GUI應(yīng)用
4、混合應(yīng)用〔Titanium,AdobeAIR〕
node.js是Common.JS的實(shí)現(xiàn)者之一。這時(shí)我們?cè)摿私庖粋€(gè)重要的函數(shù)了——require函數(shù)。使用這個(gè)函數(shù)來(lái)引入別的模塊,通俗點(diǎn)說(shuō)它類似于include(C)、import(JAVA)。比方,node.js內(nèi)置了個(gè)模塊,專門(mén)幫助我們實(shí)現(xiàn)服務(wù)。我們只需要:var=require(‘’);就可以開(kāi)場(chǎng)使用該模塊的功能了,目前就本人所知node.js官網(wǎng)現(xiàn)在已經(jīng)注冊(cè)了5747個(gè)第三方模塊。安裝這些模塊也非常的簡(jiǎn)單,不過(guò),還是先來(lái)完成第一個(gè)吧。四、服務(wù)之HelloWorld我們只用幾行代碼就可以實(shí)現(xiàn)一個(gè)服務(wù),先不要驚訝,見(jiàn)如下代碼然后保存成app.js文件,并用:nodeapp.js運(yùn)行。然后可以用瀏覽器訪問(wèn)了,地址是:://localhost:888。因?yàn)槟J(rèn)的80端口可能會(huì)有沖突,所以在這里我們使用了888端口。但是我們發(fā)現(xiàn)沒(méi)有任何效果,這是因?yàn)椋?createServer其實(shí)是可以帶參數(shù)的,而在這里我們省略了參數(shù),.createServer的參數(shù)應(yīng)該是一個(gè)函數(shù)。這個(gè)函數(shù)在每次有請(qǐng)求進(jìn)來(lái)的時(shí)候就會(huì)跑一遍,也就是說(shuō),我們每用瀏覽器訪問(wèn)一次上面的地址,我們傳進(jìn)去的函數(shù)就運(yùn)行一遍。下面我們?cè)傩薷拇a:好,現(xiàn)在再訪問(wèn)試試。瀏覽器還是什么都沒(méi)有。不過(guò),每次我們刷新瀏覽器,后臺(tái)都會(huì)告訴我們?cè)L問(wèn)進(jìn)來(lái)了。就這樣,一個(gè)服務(wù)架成了,下一篇我們將完成一個(gè)helloworld3完成HelloWorld剛剛我們用node.js快速而方便的搭建了一個(gè)服務(wù)器,現(xiàn)在我們要把helloworld發(fā)送出去。大家知道,我們的Web應(yīng)用抽象起來(lái)就是客戶端發(fā)出請(qǐng)求request,請(qǐng)求到達(dá)服務(wù)器后,服務(wù)器給客戶端發(fā)回一個(gè)應(yīng)答response。服務(wù)器和客戶端之間交流的語(yǔ)言就是協(xié)議。總之在web應(yīng)用中的兩個(gè)至關(guān)重要的東西就是request和response。 上一篇我們說(shuō)到,每次有訪問(wèn),我們的函數(shù)都會(huì)運(yùn)行一次,所以只要把request和response作為參數(shù)傳遞給tellme函數(shù),然后當(dāng)請(qǐng)求到達(dá)時(shí),node.js就會(huì)把客戶的請(qǐng)求封裝成request,預(yù)備發(fā)給客戶的應(yīng)答封裝成response。我們拿到request,看看他請(qǐng)求些什么,再把一些東西〔如讀出個(gè)文件或去查數(shù)據(jù)庫(kù)〕封裝進(jìn)進(jìn)response,發(fā)給客戶端。代碼如下:運(yùn)行他,再用瀏覽器訪問(wèn)他。在瀏覽器得到了“Helloworld!〞,再看看服務(wù)器的控制臺(tái)這一大串的就是Request了,它使用的是json格式,觀察request對(duì)象,我們可以找到一些我們熟悉的東西。比方:request.url、request.method、比方headers,可以簡(jiǎn)化一下后臺(tái):后臺(tái)的顯示內(nèi)容一目了然。至此HelloWorld例如完畢,下一節(jié)是利用nodejs創(chuàng)立一個(gè)支持靜態(tài)頁(yè)面的web服務(wù)器。4搭建一個(gè)靜態(tài)的web服務(wù)器如果想深入了解某個(gè)對(duì)象,可以在repl環(huán)境下,把這個(gè)對(duì)象打印出來(lái)。例如引入的模塊,可以repl提示符下鍵入:noderequire(‘’)然后回車(chē),會(huì)出現(xiàn)由此可見(jiàn)狀態(tài)代碼無(wú)需看文檔即可查看。下面開(kāi)場(chǎng)正題,搭建一個(gè)支持靜態(tài)頁(yè)面的web服務(wù)器一讀寫(xiě)文件為了完成搭建靜態(tài)服務(wù)器,我們需要引入文件I/O,node.js內(nèi)置了fs模塊,引入就可以讀寫(xiě)文件了。請(qǐng)按以下方式組織目錄:Webserver|_____app.js|_____root|_____index.htm這里root文件夾就是存放頁(yè)面的地方,稍懂一點(diǎn)web服務(wù)器的都很容易明白,這里不多做解釋。一會(huì)我們要把內(nèi)容從文件里讀出來(lái),顯示在控制臺(tái)并發(fā)送給瀏覽器。在寫(xiě)代碼之前,我們先用前面的方法查看fs模塊:fs里方法有很多?,F(xiàn)在我們需要去查官網(wǎng)文檔,我們就用fs.readFile方法。測(cè)試該方法的代碼建議您自己先寫(xiě)一個(gè),能更方便您了解和學(xué)習(xí),本節(jié)代碼如下:注:__dirname是兩個(gè)下劃線__!!!二、分析請(qǐng)求路徑我們已經(jīng)實(shí)現(xiàn)了讀取文本文件,并送到客戶端瀏覽器的工作。但是讀取的文件名是硬編碼在代碼里的?,F(xiàn)在我們需要讓用戶來(lái)指定他需要什么文件,然后讀出來(lái)給發(fā)過(guò)去。而用戶指定的路徑和文件名這個(gè)信息是通過(guò)request傳過(guò)來(lái)的,request的眾多的屬性里,有一個(gè)為url屬性,以前我們都是通過(guò)url來(lái)映射文件的路徑的。不過(guò)到了現(xiàn)在MVC和REST時(shí)代,情況開(kāi)場(chǎng)變得有些復(fù)雜,這里暫且不提。解釋代碼之前,我們先砍一下url,一條url一般可以分成主機(jī)地址、路徑和鍵值對(duì),如圖:我們嘗試引入url模塊,用這個(gè)工具來(lái)解析了一串例如,得到一個(gè)對(duì)象。其中pathname就是我們要的,不過(guò)現(xiàn)在我們需要將它映射為我們服務(wù)器端的絕對(duì)地址,代碼如下〔由于代碼較長(zhǎng),截圖不便,直接給出〕: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實(shí)現(xiàn)websocket5Websocket的實(shí)現(xiàn)WebSocket是什么百度百科上說(shuō)WebSocket標(biāo)準(zhǔn)的目標(biāo)是在瀏覽器中實(shí)現(xiàn)和服務(wù)器端雙向通信.雙向通信可以拓展瀏覽器上的應(yīng)用類型,例如實(shí)時(shí)的數(shù)據(jù)推送(股票行情),游戲,聊天/im等,而且websocket實(shí)現(xiàn)的是全雙工通信。與傳統(tǒng)的相比,它的優(yōu)點(diǎn)是什么雙向全雙工,持續(xù)連接,實(shí)時(shí)、事件驅(qū)動(dòng),低帶寬消耗,文檔、二進(jìn)制均可,客戶端不局限于瀏覽器。WebSocket能干什么理論上,socket能干什么,他就能干什么想要再具體了解websocket,請(qǐng)參見(jiàn)websocket官網(wǎng)。WebSocket協(xié)議與Socket.IO模塊Node.js的第三方模塊Socket.Io(詳見(jiàn)socket.io官網(wǎng))提供在Node.js上使用WebSocket協(xié)議的能力,我們需要安裝socket.io,由于我們最后目的是要建設(shè)一個(gè)聊天室,所以我們先建一個(gè)文件夾,取名為chatroom,翻開(kāi)命令行窗口,移步到chatroom目錄下,鍵入如下命令:D:\chatroom>npminstallsocket.io–d由于我已經(jīng)安裝完成,這里不給出安裝過(guò)程圖了。準(zhǔn)備工作完成后,我們還是先寫(xiě)一個(gè)最最最簡(jiǎn)的架子,然后測(cè)試,代碼如下:如果見(jiàn)到如以以下圖,則說(shuō)明運(yùn)行成功現(xiàn)在我們可以說(shuō)已經(jīng)實(shí)現(xiàn)了一個(gè)websocket了,下一節(jié)我們將利用websocket搭建一個(gè)聊天室。6利用Websocket實(shí)現(xiàn)聊天室剛剛我們成功的實(shí)現(xiàn)了websocket,下面進(jìn)入最沖動(dòng)的局部,實(shí)現(xiàn)聊天室:在chatroom文件夾下建一個(gè)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>運(yùn)行服務(wù)器端app.js文件,然后,用瀏覽器翻開(kāi)chatroom.htm文件,觀察服務(wù)器控制臺(tái):此時(shí)顯示websocket已經(jīng)連接成功?。×奶焓掖罱ㄍ瓿?。這時(shí)我們?cè)俜_(kāi)兩個(gè)瀏覽器窗口訪問(wèn):localhost:888就可以互相通信啦,至此聊天室搭建成功,本節(jié)完畢。7websocket與jquery的結(jié)合flash中有一個(gè)shareobject,可以讓大家通過(guò)網(wǎng)絡(luò)共享一個(gè)對(duì)象。曾經(jīng)有個(gè)例如,就是甲拖動(dòng)屏幕上的小球,乙的屏幕上的小球也同樣被拖動(dòng)了,乙也同樣可以拖動(dòng)的動(dòng)作共享給甲。完成這樣的功能需要FlashMediaServer,不過(guò)利用前面我們的nodejs,我們已經(jīng)可以實(shí)現(xiàn)這個(gè)案例了而且不用插件。js代碼如下:頁(yè)面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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人工耳蝸行業(yè)政策分析:人工耳蝸行業(yè)標(biāo)準(zhǔn)推動(dòng)人工耳蝸技術(shù)普及
- 2025年個(gè)人三項(xiàng)機(jī)制學(xué)習(xí)心得體會(huì)模版(3篇)
- 課題申報(bào)參考:緊密型醫(yī)聯(lián)體視角下大灣區(qū)老年中醫(yī)藥服務(wù)評(píng)價(jià)體系構(gòu)建與實(shí)證研究
- 二零二五年度集團(tuán)高層管理人員任期制競(jìng)聘與續(xù)聘合同6篇
- 2025版小時(shí)工定期雇傭合同范本3篇
- 2025版土地征收及安置補(bǔ)償中介服務(wù)合同3篇
- 全新二零二五年度房地產(chǎn)銷(xiāo)售代理合同3篇
- 二零二五版企業(yè)內(nèi)部會(huì)計(jì)檔案安全保密服務(wù)協(xié)議3篇
- 2025年度文化創(chuàng)意產(chǎn)品開(kāi)發(fā)與銷(xiāo)售合作協(xié)議范本4篇
- 二零二五年度廚具品牌設(shè)計(jì)創(chuàng)新合同4篇
- 圖像識(shí)別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個(gè)體戶店鋪?zhàn)赓U合同
- 禮盒業(yè)務(wù)銷(xiāo)售方案
- 二十屆三中全會(huì)精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級(jí)英語(yǔ)閱讀理解(帶答案)
- 仁愛(ài)版初中英語(yǔ)單詞(按字母順序排版)
- (正式版)YS∕T 5040-2024 有色金屬礦山工程項(xiàng)目可行性研究報(bào)告編制標(biāo)準(zhǔn)
- 【奧運(yùn)會(huì)獎(jiǎng)牌榜預(yù)測(cè)建模實(shí)證探析12000字(論文)】
- 危險(xiǎn)廢物貯存?zhèn)}庫(kù)建設(shè)標(biāo)準(zhǔn)
- 多層工業(yè)廠房主體結(jié)構(gòu)施工方案鋼筋混凝土結(jié)構(gòu)
- 救生艇筏、救助艇基本知識(shí)課件
評(píng)論
0/150
提交評(píng)論