Golang?websocket協(xié)議使用淺析
WebSocket與HTTP協(xié)議的主要區(qū)別
HTTP 和 WebSocket 協(xié)議的區(qū)別 HTTP 是單向的,而 WebSocket 是雙向的。
在客戶端和服務(wù)器之間的通信中,每個來自客戶端的 HTTP 請求都會建立一個新的連接,并在從服務(wù)器收到響應(yīng)后關(guān)閉,而WebSocket連接只建立一次,并在服務(wù)器或客戶端終止連接之前重復(fù)使用。
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)。
首先要導(dǎo)入"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)生方式細(xì)節(jié)探究
搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)
深入理解Golang?Channel?的底層結(jié)構(gòu)
GO中高效的將int轉(zhuǎn)換為string的方法與源碼

