【WebSocket】WebSocket介紹

1.背景 前端

    WebSocket和http協議同樣是應用層的協議,都是基於tcp的。在WebSocket出現以前客戶端向服務器發出請求是經過http協議實現的,而http協議有個特色是通行請求只能由客戶端發起,而後服務端響應查詢結果,HTTP 協議無法讓服務器主動向客戶端推送信息。這樣若是服務器有連續的狀態變化,好比新消息,客戶端要獲知就很是麻煩,只能經過輪詢,長輪詢的方式,可是這樣的效率很低,消耗了沒必要要的服務器資源(由於必須不停發送http鏈接,或者http鏈接保持始終打開。在 HTTP1.1 協議中的 keep-alive connection 是指在一次 TCP 鏈接中完成多個 HTTP 請求,可是對每一個請求仍然要單獨發 header,因此這些方式服務器和客戶端還要大量交換 httpheader,信息交換效率很低)。node

 

2.WebSocket簡介c++

    WebSocket 協議就是可使服務器能夠主動向客戶端推送信息,客戶端也能夠主動向服務器發送信息,全雙工的方式通訊,屬於服務器推送技術的一種。git

 

3.WebSocket原理github

  WebSocket是基於C/S架構,WebSocket是由Http協議握手而來。當客戶端與服務端通訊,客戶端首先向服務端發起http請求,而這個請求的特殊性在於客戶端在http頭部(header)裏帶了一個upgrade字段,告訴服務端它想要生成WebSocket協議,服務端收到以後給客戶端一個握手的確認,回答客戶端容許它對WebSocket協議的轉換,一旦完成這個協商後,客戶端和服務端的底層tcp鏈接是沒有中斷的,接下來客戶端能夠向服務端發送基於WebSocket協議的消息,這樣就完成了HTTP協議向WebSocket協議的升級,而兩端則繼續複用HTTP底層socket的連接完成後續的通訊。WebSocket傳輸單元是message,因爲當傳遞很大的數據包時候,message會被切分紅多個frame幀來傳輸,咱們編程的時候無需關注底層的frame,只須要操做message。golang

 

4.WebSocket特色web

(1)創建在 TCP 協議之上,服務器端的實現比較容易。編程

(2)與 HTTP 協議有着良好的兼容性。默認端口也是80和443,而且握手階段採用 HTTP 協議,所以握手時不容易屏蔽,能經過各類 HTTP 代理服務器。後端

(3)數據格式比較輕量,性能開銷小,通訊高效。瀏覽器

(4)能夠發送文本,也能夠發送二進制數據。

(5)沒有同源限制,客戶端能夠與任意服務器通訊。

(6)協議標識符是ws(若是加密,則爲wss),服務器網址就是 URL。

以下:

ws://example.com:80/path

  (7)Websocket爲一次HTTP握手後,後續通信爲tcp協議的通信方式。

5.WebSocket用途

  1)心跳包。

  2)網頁即時通訊

 

 

6.WebSocket後端技術選型

  1.nodejs:WebSocket自己主要是應用於瀏覽器,屬於瀏覽器裏面的一種編程,對於前端開發nodejs比較熟悉,可使用nodejs作長連接。不過nodejs仍是js,js自己特性是單線程模型,雖然能夠多進程,可是推送性能有限。

    2.c/c++:使用c/c++實現WebSocket,成本比較高,可能須要手動實現對WebSocket協議對封裝。

      3.golang:編譯型語言,速度快,多線程,實現併發容易,基於協程模型併發。因此開發起來比較簡單,可讓咱們更加專一於業務。其次有內置標準的WebSocket標準庫,無需造輪子。

 

7.使用go語言完成WebSocket開發

  使用go語言的 gorilla/websocket 第三方開發包來開發WebSocket 服務。

  下載包:go get github.com/gorilla/websocket

   利用這個開發包開發WebSocket 服務很簡單,下面有個demo

package main import ( "net/http" ) func wsHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("websocket connected success!")) } func main() { http.HandleFunc("/ws",wsHandler) http.ListenAndServe("0.0.0.0:7777",nil) }

 

   而後運行,打開瀏覽器,運行成功

相關文章
相關標籤/搜索