基本上這個(gè)基礎(chǔ)框架拿到手之后就可以做一些自己想要做的改動(dòng)了,比如你想添加個(gè)隊(duì)列的插件,你可以在相應(yīng)的目錄里面進(jìn)行修改了,但我想讓它更通用一些,本篇文章將會(huì)啟動(dòng)一個(gè)websocket服務(wù),并且把配置文件改成yaml格式。
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的臨縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
之所以想要把配置從json改為yaml,有以下幾點(diǎn)原因:
在此,解析yaml文件用的包是"gopkg.in/yaml.v2",例子可以在github上找到,文末可以找到本項(xiàng)目的鏈接。
我希望這個(gè)項(xiàng)目能夠盡可能地涵蓋一些基礎(chǔ)的功能,所以我為它添加了websocket的接口,來看看我具體是怎么做的。
之前說過本項(xiàng)目的具體處理邏輯都會(huì)在process/controller下進(jìn)行,而接口層面則是在http和rpc目錄下去分發(fā)。在添加websocket進(jìn)到這個(gè)框架之前,我們要先知道一點(diǎn):websocket是一種協(xié)議,一種在http上升級(jí)的協(xié)議,所以它并不像我們之前開啟http服務(wù)一樣,直接監(jiān)聽端口,而是在http服務(wù)上開一個(gè)接口,通過接口去實(shí)現(xiàn)服務(wù)端與客戶端的連接,好了,明確了這一點(diǎn)之后,我們來看看代碼方面如何實(shí)現(xiàn)。
首先,我們添加一個(gè)路由。
engine.GET("/ws", Ws)
然后,實(shí)現(xiàn)路由指向的handler--Ws。
func Ws(ctx *gin.Context) {
ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)
if err != nil {
return
}
defer ws.Close()
for {
//讀取數(shù)據(jù)
mt, message, err := ws.ReadMessage()
if err != nil {
break
}
if string(message) == "ping" {
message = []byte("pong")
}
if string(message) == "server_time" {
resp, _, _ := controller.GetServerTime()
serverTime := strconv.FormatInt(resp.ServerTime, 10)
message = []byte(serverTime)
}
//寫入數(shù)據(jù)
err = ws.WriteMessage(mt, message)
if err != nil {
break
}
}
}
注意一下,這一句代碼:
ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)
前面說了,websocket是一個(gè)協(xié)議,一個(gè)http之上的協(xié)議,因此,我們對(duì)http“升級(jí)”了。代碼中還用了一個(gè)for循環(huán),這就很像是http的監(jiān)聽一樣。為了統(tǒng)一,我們調(diào)用了controller.GetServerTime()來獲取系統(tǒng)時(shí)間,這就讓http接口和ws接口都統(tǒng)一了,真正的實(shí)現(xiàn)邏輯都在controller。
再來,我們寫一個(gè)客戶端來測(cè)試:
func TestWs(t *testing.T) {
var dialer *websocket.Dialer
conn, _, err := dialer.Dial("ws://127.0.0.1:8080/ws", nil)
if err != nil {
fmt.Println(err)
return
}
go timeWriter(conn)
for {
_, message, err := conn.ReadMessage()
if err != nil {
fmt.Println("read:", err)
return
}
fmt.Printf("received: %s\n", message)
}
}
func timeWriter(conn *websocket.Conn) {
for {
time.Sleep(time.Second * 2)
conn.WriteMessage(websocket.TextMessage, []byte(time.Now().Format("2006-01-02 15:04:05")))
conn.WriteMessage(websocket.TextMessage, []byte("ping"))
conn.WriteMessage(websocket.TextMessage, []byte("server_time"))
}
}
到此為止,我們就為這個(gè)框架添加了websocket的功能,并且把配置文件的格式從json改為了yaml,看起來更加清晰了。
網(wǎng)頁題目:golang框架怎么添加websocket的功能
標(biāo)題網(wǎng)址:http://bm7419.com/article20/pcejco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、靜態(tài)網(wǎng)站、虛擬主機(jī)、網(wǎng)頁設(shè)計(jì)公司、定制網(wǎng)站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)