平常 App 串 API 就是使用 Restful 的方式,現在想要在 App 取得即時資訊,一個較為可靠的做法是 Socket。應用例如我常用的通訊 App,Line、Messenger、Wechat、Telegram等。
首先來看 Socket 流程圖~

透過上面圖片可以了解,服務器端先初始化 Socket,然後與端口綁定 (bind),對端口進行監聽 (listen),調用接受 (accept) 阻塞,等待客戶端連接。
在這時如果有個客戶端初始化一個 Socket,然後連接服務器 (connect),如果連接成功,這時客戶端與服務器端的連接就建立了。
客戶端發送數據 (send) 請求,服務器端接收 (recv) 請求並處理請求,然後把回應數據發送 (send) 給客戶端,客戶端讀取 (recv) 數據,最後連接關閉 (close),一次完整互動結束。
Socket 的優點:
- 傳輸數據為字節級,傳輸數據可自定義,數據量小
- 傳輸數據時間短,性能高
- 適合於客戶端和服務器端之間訊息即時交互
- 可以加密,數據安全性強
- 保持連接狀態
- 節省頻寬
Socket 的缺點:
- 需對傳輸的數據進行解析,轉化成應用級的數據
- 對開發人員的開發水平要求高
- 相對於 Http 協議傳輸,增加了開發量
WebSocket
WebSocket protocol 是 HTML5 一種新的協議。它實現了瀏覽器與服務器全雙向通訊,能更好地節省服務器資源和頻寬,並達到即時通訊,它是建立在 TCP 之上,同 HTTP 一樣透過 TCP 來傳輸數據。WebSocket 同 HTTP 一樣也是應用層的協議,並且一開始的握手也需要藉助 HTTP 請求完成。
它和 HTTP 最大不同是:
- WebSocket 是一種雙向通訊協議,在建立連接後,WebSocket 服務器和 Browser/Client Agent 都能主動的向對方發送或接收數據,就像 Socket 一樣;
- WebSocket 需要類似 TCP 的客戶端和服務器端透過握手連接,連接成功後才能相互通訊。


上圖對比可以看出,相對於傳統 HTTP 每次請求,應答都需要客戶端與服務端建立連接的模式,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式,一旦 WebSocket 連接建立後,後續數據都以幀序列的形式傳輸。
在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前,不需要客戶端和服務端重新發起連接請求。在海量客戶端與服務器的交互流量大情況下,節省極大網路頻寬資源的消耗,在性能上有明顯的優勢,且客戶端發送和接受訊息是在同一個持久連接上發起,明顯有即時性優勢。
WebSocket 與 Socket 的區別
Socket 其實並不是一個協議,而是為了方便使用 TCP 或 UDP 而抽象出來的一層,是位於應用層和傳輸控制層之間的一組介面。
Socket 是應用層與 TCP/IP 協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket 其實就是一個門面模式,它把複雜的 TCP/IP 協議族隱藏在 Socket 介面後面,對使用者來說,一組簡單的介面就是全部,讓 Socket 去組織資料,以符合指定的協議。
當兩臺主機通訊時,必須通過 Socket 連線,Socket 則利用 TCP/IP 協議建立 TCP 連線。TCP 連線則更依靠於底層的 IP 協議,IP 協議的連線則依賴於鏈路層等更低層次。
WebSocket 則是一個典型的應用層協議。
區別:Socket是傳輸控制層協議,WebSocket是應用層協議。
WebSocket 與 HTTP 的關係
相同點
- 都是一樣基於 TCP,都是可靠性傳輸協議。
- 都是應用層協議。
不同點
- WebSocket 是雙向通訊協議,模擬 Socket 協議,可以雙向傳送或接受資訊。HTTP 是單向的。
- WebSocket 是需要握手進行建立連線。
聯絡
WebSocket 在建立握手時,資料是透過 HTTP 傳輸。但是建立之後,在真正傳輸時候是不需要 HTTP 協議。
參考:
隨意留個言吧:)~