欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang?websocket協(xié)議使用淺析

 更新時(shí)間:2023年05月19日 08:31:16   作者:Sahm5k  
這篇文章主要介紹了Golang?websocket協(xié)議的使用,WebSocket是一種新型的網(wǎng)絡(luò)通信協(xié)議,可以在Web應(yīng)用程序中實(shí)現(xiàn)雙向通信,感興趣想要詳細(xì)了解可以參考下文

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?panic的三種產(chǎn)生方式細(xì)節(jié)探究

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

    這篇文章主要介紹了Go?panic的三種產(chǎn)生方式細(xì)節(jié)探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go語(yǔ)言如何使用gin庫(kù)實(shí)現(xiàn)SSE長(zhǎng)連接

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

    所謂長(zhǎng)連接指在一個(gè)TCP連接上可以連續(xù)發(fā)送多個(gè)數(shù)據(jù)包,在TCP連接保持期間,如果沒(méi)有數(shù)據(jù)包發(fā)送,需要雙方發(fā)檢測(cè)包以維持此連接,一般需要自己做在線維持,下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言如何使用gin庫(kù)實(shí)現(xiàn)SSE長(zhǎng)連接的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 搭建Go語(yǔ)言的ORM框架Gorm的具體步驟(從Java到go)

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

    很多朋友不知道如何使用Goland軟件,搭建一個(gè)ORM框架GORM,今天小編給大家分享一篇教程關(guān)于搭建Go語(yǔ)言的ORM框架Gorm的具體步驟(從Java到go),感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2022-09-09
  • 深入理解Golang?Channel?的底層結(jié)構(gòu)

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

    這篇文章主要介紹了深入理解Golang?Channel?的底層結(jié)構(gòu),Go?語(yǔ)言的?channel?底層是什么數(shù)據(jù)結(jié)構(gòu)?下面我們就一起來(lái)深入解析一下?channel,需要的朋友可以參考下
    2022-01-01
  • Go語(yǔ)言中DateTime的用法介紹

    Go語(yǔ)言中DateTime的用法介紹

    這篇文章介紹了Go語(yǔ)言中DateTime的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • GO中高效的將int轉(zhuǎn)換為string的方法與源碼

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

    本文將從逐步介紹幾種在?Go?中將?int?轉(zhuǎn)換為?string?的常見(jiàn)方法,并重點(diǎn)剖析這幾種方法在性能上的特點(diǎn),另外,還會(huì)重點(diǎn)介紹?FormatInt?高效的算法實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • Go語(yǔ)言中的字符串拼接方法詳情

    Go語(yǔ)言中的字符串拼接方法詳情

    本文介紹Go語(yǔ)言中的string類型、strings包和bytes.Buffer類型,介紹幾種字符串拼接方法的相關(guān)資料,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-10-10
  • 最新評(píng)論