用 Socket.IO 打造多人聊天室👨👨👧👧 (上)
了解WebSocket概念與應用,搭建環境
目錄
- WebSocket是什麼?
- 什麼時候需要WebSocket?
- 手把手實作
- 邏輯流程
- 安裝node.js
- 新建專案並安裝socket.io套件
- 建立頁面
WebSocket 是什麼?
在說明 WebSocket 之前,必須先理解HTTP是什麼:
一般來說,當我們在瀏覽網頁時,瀏覽器(Client)為了取得資料,會先向伺服器(Server)發送請求,然後伺服器才會發送回應(data)給瀏覽器,如此我們才能看到網站內容,而這一切都是透過HTTP協定達成的。
WebSocket 與 HTTP 一樣,也是一種網路傳輸協定,但它與HTTP不同的是
WebSocket 允許伺服器主動向瀏覽器發送請求。
可以看到在下圖中,WebSocket 只要在一開始,先讓Server與Client完成一次握手,之後就可以創造持久性連接,進行雙向的傳輸。
總結
- HTTP: 只能單向溝通,只能由瀏覽器主動發送請求給伺服器
- WebSocket: 可雙向溝通,可由瀏覽器或伺服器主動發送請求給彼此
什麼時候需要 WebSocket ?
想想看,假如今天我們想要瀏覽股市交易網站,或多人共同編輯等等的即時性網站,它們的資料必須非常及時,幾乎是每秒甚至更短的時間在更新,這時候要怎麼做呢?
在過去大多是採用【輪詢 Polling 】技術,讓瀏覽器固定一段時間(例如10秒)自動發出 HTTP 請求給伺服器,來獲取最新的網頁資料。不過這種做法相當老舊,而且對伺服器的負擔很大。在即使伺服器端資料沒有更新的情況下,客戶端還是必須不停地送出HTTP請求,這就會造成網路資源的浪費。
好在 WebSocket 能夠解決這個問題。透過它我們能讓伺服器與瀏覽器進行雙向資料的傳輸,讓雙方只在有更新時才主動發送請求給彼此,進而大幅提升了方便性與效能 !
備註: 除了Polling與WebSocket外,還是有其他即時通訊技術,有興趣參考
手把手實作
關於Socket.Io
Socket.IO是一個建立即時性通訊網頁應用的 JavaScript 函式庫,它把Client端與Server端的程式統一成一致的操作方式,讓使用者只需專注在處理「事件」,就可以快速開發出應用。
此外,Socket.IO封裝了WebSocket以及其他協議,所以寫程式時並不需要知道這些細節,只需要設定好就可以運作。它也支援『房間』的概念,可以使用同一條WebSocket卻擁有不被彼此干擾的資料傳輸。
實作說明
接下來我們會實作一個簡單的多人聊天室,一開始用戶會需要在大廳先輸入名稱,點撃 start 後,如果名稱未重複就進入聊天室,反之跳出警示。
進入後,用戶可以看到在線人數與聊天訊息,也可以發送訊息到聊天室內。如用戶要離開,點選右上叉叉即可。
1. 安裝node.js
由於後端伺服器是採用node.js,因此我們須先安裝環境,流程如下
- 先在node官網下載LTS版本(較穩定)
- 點擊安裝(過程只需一直按next即可)
- 開啟Terminal輸入以下內容,如有顯示版號則表示安裝成功
- node:
node -v
- npm:
npm -v
完成後,我們就能使用node與npm了
補充----
node.js:
不是程式語言(programming language), 也不是框架(framework),它是runtime執行環境,它允許在後端(脫離瀏覽器環境)運行JavaScript程式碼。npm:
全名為Node Package Manager,開發者可以透過安裝Node來獲得隨附的npm cli,進行套件的安裝及管理
2. 新建資料夾,安裝socket.io套件
- 在桌面新增資料夾,並命名為
chatroom-project
- 開啟終端機,輸入指令
cd 資料夾位置
,進入該資料夾 - 輸入
npm init
進行專案初始化,此時會出現專案名稱、版本號、專案描述等輸入請求,可直接按Enter跳過或填入內容 - 安裝 socket.io 套件:
npm install socket.io@2.3.0
- 安裝 jquery 套件:
npm install jquery
- 進入專案,選擇 package.json,查看
dependencies
內是否有這兩支套件,有則表示安裝成功 !
3. 建立頁面
由於目前資料夾內還很空,我們來新建一些檔案,目錄結構如下
- 頁面文件:index.html
- 圖片: 下載
- 樣式: chat.css
- 後端JS: app.js
- 前端JS: chat.js
- socket.io.js (需下載)
進入index.html,加入以下內容
進入chat.css,加入以下內容 ( 或是也可以改成自己喜歡的樣式哦 )
編輯完成後,記得儲存專案,接下來我們每一次的修改都要記得儲存才能瀏覽。儲存後開啟index.html,點撃右鍵 > 選擇Open with Live Server,就能看到畫面囉!
做到這裡,我們已經把大致環境以及前置作業都搭建完成啦 !(掌聲 🙌🙌 )
在下章節中,我們會全心專注在搭建後端node.js Server,以及引入Socket.IO來處理事件,如果沒有node.js基礎的人也沒有關係,透過這次練習也能夠對它更加熟悉,一起探索WebSocket的強大之處吧