系列目錄:Node.js摸石頭系列目錄
從這回開始,我們來搭建一個簡單的聊天室。因為 http 協議是無狀態的,搭建聊天室這樣的事從來都讓人覺得疙疙瘩瘩的不是那么順理成章。如果不使用 flash、applet 等瀏覽器插件的話,我們需要定期輪詢服務器來獲取大家的聊天信息。這造成了一定的延遲和大量的網絡通訊。
不過,隨着 HTML5 的浮出水面,這一情況有望徹底改觀了。在 HTML5 的眾多特性中,有一個總是悄悄站在幕后的大哥級人物,他就是 WebSocket 。WebSocket 實在是太強大了,Firefox 瀏覽器在支持一段時間后,覺得實在不能保證這位大哥不會干出點什么出格的事,把他打入冷宮。可是正如毛遂說的,釘子放在口袋里,遲早都會冒出頭的。現在最新版的 Chrome 、 Firefox 均支持 WebSocket ,還有 IE 10 據說也將支持。
一、WebSocket 是什么?
在說明 WebSocket 的時候,我們需要和 HTTP 對比來看,才會發現他的價值。
HTTP |
WebSocket |
雙向、但是半雙工 |
雙向全雙工 |
無狀態 |
持續連接 |
高延遲 |
實時,事件驅動 |
高帶寬消耗 |
低帶寬消耗 |
面向文檔設計 |
文檔、二進制均可,客戶端不局限於瀏覽器 |
好了,比也比完了,如果你還有點迷糊的話,哎,那我辛苦點,打個比方好了。我們把服務器比做一位美麗的公主,我們就是那苦命的追求者,之一。 http 時代:我們寫了一封信(request),交給書童,快,送信去,路上別偷懶。書童到了公主的宮殿,在門口被攔了下來,交出路條(request headers),哦,進去吧。還好,公主對我們也還算熱情,很快寫好了信(response),放進信封,貼上標簽(response headers) ,交給書童。書童再屁顛屁顛跑回來交給我們。隨着我們和公主感情的不斷升溫,我們開始豢養一群名叫阿賈克斯的信鴿,這樣,就可以很快地把我們寫的小詩小詞送給公主了。公主如果想我們的時候,也可以在有信鴿來的時候,把她的手帕啊什么的栓在鴿子腿上給我們捎回來。HTML5 時代來了,我們和公主的關系也開始如膠似漆起來,光靠信件和便簽已經不能滿足了,還好,我們有 WebSocket ,只要我們讓書童送去一封信,WebSocket 就會來在我們和公主之間架起一條電話熱線,這樣公主說話您立刻就能聽見,您說話公主也立刻能聽見,當然,因為這條熱線是雙向全雙工的,你們還可以一起合唱一首小情歌。
好了,說下個人的理解,不知道對不對,權當參考:WebSocket 就是通過 http 協議實現握手的 socket 。
下面是摘自 Kaazing 《WebSocket –The Web Communication Revolution 》 中的一副圖:
二、WebSocket 能干什么?
理論上,socket 能干什么,他就能干什么。
這個問號的答案是無限的,我們看看這個在線版的 Quake 游戲吧,也許他能點亮我們的大腦。
家庭作業:和你的本我、自我、大我、小我開個頭腦風暴會,討論 WebSocket 對 Web 應用開發的深刻影響。
三、WebSocket 協議與 Socket.IO 模塊
WebSocket 規范由客戶端和服務器端規范分別組成。客戶端由 W3C 制訂,服務器端規范由 IETF 制訂。Node.js 的第三方模塊 Socket.IO 提供在 Node.js 上使用 WebSocket 協議的能力。
說得已經夠多了,下面動手了。
建一個項目文件夾,這里我用 chatroom 好了,您自便。打開命令行窗口,移步到 chatroom 目錄下,鍵入如下命令:
D:\chatroom> npm install socket.io –d
見圖:(-d 參數可以使我們能夠觀察到安裝的詳細情況,但有資料說 –d 是安裝齊所有依賴包,不管了,加上總比不加好,是吧?)
如果最后出現“ npm info ok ”,恭喜你,socket.io 模塊安裝成功。查看 chatroom 目錄,得到如下結構:
四、還是先打地基
准備工作完成后,我們還是先寫一個最最最簡的架子,然后測試他。
請看代碼:
/* 平安夜快樂之聊天室框架 */ //照例先引入模塊,這次我們需要 http 和 socket.io 兩個 var http = require('http'), socketio = require('socket.io'); //注意,和前面的區別是我們需要拿到 http 創建的服務器實例 var app = http.createServer(function(request,response){ //TODO 后面我們會在這把聊天室頁面發回去,不過現在我們簡單地提示就好了。 response.end('Server ok.'); }) ; //http 服務開始偵聽 app.listen(888); console.log("Http Server start at 888"); // socket.io 開始偵聽 var io = socketio.listen(app); // WebSocket 協議握手成功 io.sockets.on('connection',function(socket) { console.log("Websocket connect ok ..."); });
保持為 app.js 文件。運行。
D:\chatroom> node app.js
如果見到如下圖,那么恭喜你,WebSocket 已經准備好來為我們的聊天室服務了。
看提示第一行是我們輸出的說明 http 服務啟動的信息,第二行是 Node.js ,或者准確地說是 Socket.IO 給我們的提示信息,真體貼啊。聽是在聽了,那么他們有沒有謊報軍情呢?試試看就知道了。
請打開瀏覽器,等等,什么瀏覽器都可以嗎?你不是說只有 chrome 和 火狐? 呃,差點忘了,Socket.IO 不僅幫助我們實現了 WebSocket 協議,還幫助我們提高了瀏覽器的兼容性,現在已經支持 IE5+、Safari 3+、 Chrome 4+、火狐 3+、Opera 10.61+,還支持一些手機和平板上得瀏覽器。
- 請在地址欄鍵入:
觀察控制台和瀏覽器,你會發現控制台提示你: debug – served static content /socket.io.js ,而瀏覽器我們也得到了一段,不,一大段 js 代碼,這說明我們的任務完成了。 Http 服務正常,WebSocket 服務正常,火箭即將發射!
----------------------- 平安夜的分割線,祝大家平安夜快樂 -----------------------------------------
我知道您有疑問,那段 js 代碼是什么?哪里來的。嗯,欲知后事如何,請聽下回分解。