? ? ? ? 聊天是最典型的多用戶實時交互的應用。從IRC開始,有許多開源或者不開源的協議都運行在非標準端口上,而現在,使用 Node.js 則可以解決這些問題——在標準的80端口運行 WebSockets。
聊天應用程序是最能體現 Node.js 優點的例子:輕量級、高流量并且能良好的應對跨平臺設備上運行密集型數據(雖然計算能力低)。同時,聊天也是一個非常值得學習的用例,因為它很簡單,并且涵蓋了目前為止一個典型的 Node.js 會用到的大部分解決方案。
在最簡單的情況下,我們布置了一個聊天室在我們的網站上,用戶可以在上面發消息,當然是一對多的形式。例如,假設總共有三個人連接到我們的網站上。
在服務端這邊, 我們有一個使用 Express.js 搭建的簡單站點,該站點實現了兩件事 1) 處理路徑為 ‘/’ 的GET請求時,下發包括一個留言板以及一個發送信息的 ‘發送’ 按鈕的頁面 2) 一個監聽客戶端發送新消息的 websockets 服務。
在客戶端這邊,我們有一個 HTML 頁面,上面有個兩個 js 方法,一個是用于觸發事件的 “發送” 按鈕,這會把把輸入的消息通過 webscoket 發送,另一個方法是用 webscoket 在客戶端上監聽服務端來的推送(例如,其他用戶發送的消息)。
當有一個客戶端發送消息的時候,發生的事情是:
瀏覽器上,點擊發送按鈕觸發了 js 函數,將輸入框中的文字通過 websocket 消息發送到服務器的 websocket 客戶端(頁面初始化加載的時候連接的)。
服務端的 websocket 組件收到 消息,然后通過廣播方法轉發到其他所有連接的客戶端。
通過頁面上運行的 websocket 客戶端組件,所有的客戶端都能收到這條推送的新消息。接著 js 處理函數可以把這個消息添加到文字框內。
這是一個最簡單的例子。如果要更好的解決方案,你可以使用 Redis 數據庫做一個簡單的緩存。在一個更高級的解決方案中,你可能需要一個消息路由來專門處理消息隊列,并且需要一個更強健的發送機制,比如發送的時候覆蓋上暫時離線的用戶或者為離線的注冊用戶存儲尚未接收的消息等等。但是不論你做了怎么樣的改進,Node.js 都將遵循一個基本原則:響應事件,處理多個并發連接,并保持流動性的用戶體驗。