Golang?websocket協(xié)議使用淺析
WebSocket與HTTP協(xié)議的主要區(qū)別
HTTP 和 WebSocket 協(xié)議的區(qū)別 HTTP 是單向的,而 WebSocket 是雙向的。
在客戶端和服務(wù)器之間的通信中,每個(gè)來(lái)自客戶端的 HTTP 請(qǐng)求都會(huì)建立一個(gè)新的連接,并在從服務(wù)器收到響應(yīng)后關(guān)閉,而WebSocket連接只建立一次,并在服務(wù)器或客戶端終止連接之前重復(fù)使用。
HTTP 的空閑連接的超時(shí)時(shí)間為 60 秒??捎糜陧憫?yīng)時(shí)間非常短的調(diào)用。
WebSocket 空閑連接的超時(shí)時(shí)間為 3600 秒(1 小時(shí)),可應(yīng)用于響應(yīng)時(shí)間長(zhǎng)于 60 秒的調(diào)用,最大連接數(shù)為 250。
WebSocket服務(wù)器
首先,創(chuàng)建一個(gè) HTTP 服務(wù)器。在這個(gè)服務(wù)器中,創(chuàng)建一個(gè)用于處理 WebSocket 連接的函數(shù) handleWebSocket。
其實(shí)就是開(kāi)啟一個(gè)http服務(wù)器。
func HandleWebSocket(w http.ResponseWriter, r *http.Request) { } func main() { http.HandleFunc("/ws", HandleWebSocket) http.ListenAndServe(":8080", nil) }
然后在該函數(shù)中,使用 gorilla/websocket 包來(lái)處理 WebSocket 連接。
1.建立upgrade變量。
websocket協(xié)議建立連接的握手過(guò)程就是http協(xié)議的頭部加入了upgrade字段(upgrade:websocket)。
首先要導(dǎo)入"github.com/gorilla/websocket"包
var upgrade = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, }
2.升級(jí)http連接成websocket連接,處理websocket連接
將http連接頭部加入upgrade字段,成為websocket協(xié)議。
func HandleHome(w http.ResponseWriter, r *http.Request) { //升級(jí)成websocket conn, err := upgrade.Upgrade(w, r, nil) if err != nil { log.Println(err) } //websocket讀寫(xiě)邏輯 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客戶端
客戶端主要是用來(lái)測(cè)試websocket服務(wù)器是否正確工作的,下面提供兩種websocket服務(wù)器。
html+js實(shí)現(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包實(shí)現(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改
這篇文章主要為大家介紹了Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

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

go語(yǔ)言如何使用gin庫(kù)實(shí)現(xiàn)SSE長(zhǎng)連接

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

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

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