作者:vousiu 出處:http://www.cnblogs.com/vousiu 本實例參考自Mike Cantelon等人的《Node.js in Action》一書。 本實例要實現如下一個聊天App。左上的“Winter”為顯示的房間的名字。中間為聊天消息,斜體字為系統消息,非斜體為聊天內容 ...
作者:vousiu
出處:http://www.cnblogs.com/vousiu
本實例參考自Mike Cantelon等人的《Node.js in Action》一書。
本實例要實現如下一個聊天App。左上的“Winter”為顯示的房間的名字。中間為聊天消息,斜體字為系統消息,非斜體為聊天內容。右側為房間列表,點擊房間名可以進入房間。在下方輸入框輸入內容後,點擊“提交”則可以發送聊天信息,或者發送更改昵稱和更換房間的指令。
整個程式的架構圖如下:
文件目錄結構如下所示:
其中,socket.io包提供了一些webSocket方法,它可以跟http伺服器在同一個埠進行監聽,socket伺服器可以對用戶的連接和事件以回掉函數的方式進行響應。
chat_server.js用socket.io寫了一個聊天伺服器,處理與聊天相關的事件。它有一系列變數來存儲每個socket所對應的名字、房間號還有系統已占用的名字。在每個用戶與其建立connection時,它用回調函數為這個用戶賦一個名字和房間,然後為這個用戶的每個socket設置一個回調。有的回調就對發出的用戶進行響應,有的則需要對一批用戶進行響應(比如有人進了他們的房間),就像下圖所示:
chat_server監聽 <--------- connect ---------- 用戶上線
chat_server處理 <--------- socket.io --------- 用戶界面命令(chat.js中的函數)
處理完畢 ----------- socket.io--------> 界面更新(chat_ui.js中的回調函數來處理)
----- (broadcast) socket.io --------> 一批用戶的界面
chat_server監聽 <-------- disconnect -------- 用戶下線
這個chat_server同時對多個用戶的connection進行相應,那會不會造成在多線程中經常出現的問題:給多個用戶分配同一個名字呢?按我的理解是不會的,因為它是一個connection一個connection的處理,對一個用戶的connection回調函數執行完前,另一個用戶的包含在connection回調函數中的名字分配函數不會進入node隊列。
chat.js中定義了向一個socket發送各種消息和指令的函數。
chat_ui.js定義了在界面載入完時執行的一個回調,該回調註冊了:對於用戶界面操作的相應函數 和 對於socket.io的響應函數。
index.html和style.css則提供了用戶界面。
最後,server.js在3000埠進行監聽和文件傳輸,預設傳輸index.html文件。它還有一個對於文件的緩存功能。然後啟動了chat_server伺服器。
除了對於功能的實現,對於這個實例的一個關註點就是,它是一個Node程式,因此很多地方是使用非同步回調函數的方法來寫的,會出現一個回調套一個回調,裡面再套一個回調的寫法,這值得寫慣了傳統程式的程式員進行註意。
對於這些文件中代碼的具體內容,將在接下來的文章中做具體介紹。