Golang?websocket協(xié)議使用淺析
WebSocket與HTTP協(xié)議的主要區(qū)別
HTTP 和 WebSocket 協(xié)議的區(qū)別 HTTP 是單向的,而 WebSocket 是雙向的。
在客戶端和服務(wù)器之間的通信中,每個來自客戶端的 HTTP 請求都會建立一個新的連接,并在從服務(wù)器收到響應(yīng)后關(guān)閉,而WebSocket連接只建立一次,并在服務(wù)器或客戶端終止連接之前重復使用。
HTTP 的空閑連接的超時時間為 60 秒??捎糜陧憫?yīng)時間非常短的調(diào)用。
WebSocket 空閑連接的超時時間為 3600 秒(1 小時),可應(yīng)用于響應(yīng)時間長于 60 秒的調(diào)用,最大連接數(shù)為 250。
WebSocket服務(wù)器
首先,創(chuàng)建一個 HTTP 服務(wù)器。在這個服務(wù)器中,創(chuàng)建一個用于處理 WebSocket 連接的函數(shù) handleWebSocket。
其實就是開啟一個http服務(wù)器。
func HandleWebSocket(w http.ResponseWriter, r *http.Request) { } func main() { http.HandleFunc("/ws", HandleWebSocket) http.ListenAndServe(":8080", nil) }
然后在該函數(shù)中,使用 gorilla/websocket 包來處理 WebSocket 連接。
1.建立upgrade變量。
websocket協(xié)議建立連接的握手過程就是http協(xié)議的頭部加入了upgrade字段(upgrade:websocket)。
首先要導入"github.com/gorilla/websocket"包
var upgrade = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, }
2.升級http連接成websocket連接,處理websocket連接
將http連接頭部加入upgrade字段,成為websocket協(xié)議。
func HandleHome(w http.ResponseWriter, r *http.Request) { //升級成websocket conn, err := upgrade.Upgrade(w, r, nil) if err != nil { log.Println(err) } //websocket讀寫邏輯 for { messageType, p, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Println("receive:", string(p)) conn.WriteMessage(messageType, []byte("hello, i am server")) } }
WebSocket客戶端
客戶端主要是用來測試websocket服務(wù)器是否正確工作的,下面提供兩種websocket服務(wù)器。
html+js實現(xiàn)
<!DOCTYPE html> <html> <head> <title>WebSocket Test</title> </head> <body> <script> var ws = new WebSocket("ws://localhost:8080/ws"); ws.onopen = function() { console.log("WebSocket connection opened."); ws.send("Hi From the Client!") }; ws.onmessage = function(event) { console.log("Received message: " + event.data); }; ws.onclose = function() { console.log("WebSocket connection closed."); }; ws.onerror = function(event) { console.log("WebSocket error: " + event.data); }; </script> </body> </html>
利用golang websocket包實現(xiàn)
func WebSocketClient() { conn, _, err := websocket.DefaultDialer.Dial("ws://127.0.0.1:8080/ws", nil) if err != nil { panic(err) } defer conn.Close() for { time.Sleep(time.Second) conn.WriteMessage(websocket.TextMessage, []byte("hi i am client")) _, p, err := conn.ReadMessage() if err != nil { log.Println(err) } println("client recv:", string(p)) } }
到此這篇關(guān)于Golang websocket協(xié)議使用淺析的文章就介紹到這了,更多相關(guān)Go websocket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言fsnotify接口實現(xiàn)監(jiān)測文件修改
這篇文章主要為大家介紹了Go語言fsnotify接口實現(xiàn)監(jiān)測文件修改的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

Go?panic的三種產(chǎn)生方式細節(jié)探究

搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

深入理解Golang?Channel?的底層結(jié)構(gòu)

GO中高效的將int轉(zhuǎn)換為string的方法與源碼