golang框架怎么添加websocket的功能

基本上這個(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)原因:

  1. json主要是用于信息傳輸,而yaml更適合作為配置文件的格式來使用,兩者的用途不一樣;
  2. yaml格式看起來比json更加清晰;
  3. 在yaml文件中可以添加注釋,讓配置更加易懂。

在此,解析yaml文件用的包是"gopkg.in/yaml.v2",例子可以在github上找到,文末可以找到本項(xiàng)目的鏈接。

為框架添加websocket的服務(wù)

我希望這個(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)

成都網(wǎng)站建設(shè)公司