前文提到Go WebSocket開發(fā)與測(cè)試實(shí)踐【/net/websocket】,今天分享一下另外一個(gè)Go WebSocket實(shí)現(xiàn)庫gorilla/websocket,這個(gè)類庫功能這也是我找到資料最多的實(shí)現(xiàn)方式。gorilla/websocket得到官方認(rèn)可的庫,如果大家使用Go語言做WebSocket的開發(fā)測(cè)試的話,我建議使用gorilla/websocket。

文章引用

Golang 官方標(biāo)準(zhǔn)庫實(shí)現(xiàn)的 websocket 在功能上有些欠缺,本次介紹的 gorilla/websocket 庫,是Gorilla出品的速度快、質(zhì)量高,并且被廣泛使用的 websocket 庫,很好的彌補(bǔ)了標(biāo)準(zhǔn)庫功能上的欠缺。

依賴

github.com/gorilla/websocket v1.4.2

WebSocket開發(fā)

跟Go官方標(biāo)準(zhǔn)庫實(shí)現(xiàn)有一點(diǎn)較大區(qū)別就是需要Upgrader對(duì)象,用來處理將HTTP請(qǐng)求升級(jí)為WebSocket請(qǐng)求,創(chuàng)建比較簡(jiǎn)單,下面是Demo:

    var upgrader = websocket.Upgrader{        ReadBufferSize:   1024,        WriteBufferSize:  1024,        HandshakeTimeout: 5 * time.Second,    }

下面是創(chuàng)建WebSocket服務(wù)的代碼:

// TestWEBs 創(chuàng)建一個(gè)WebSocket服務(wù)// @Description:// @param tfunc TestWEBs(t *testing.T) {    var upgrader = websocket.Upgrader{        ReadBufferSize:   1024,        WriteBufferSize:  1024,        HandshakeTimeout: 5 * time.Second,    }    http.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) {        conn, _ := upgrader.Upgrade(w, r, nil)         for {            msgType, msg, err := conn.ReadMessage()            if err != nil {                return            }            fmt.Printf("%s receive: %s/n", conn.RemoteAddr(), string(msg))            if err = conn.WriteMessage(msgType, msg); err != nil {                return            }        }    })    http.ListenAndServe(":12345", nil)}

客戶端

本次依然使用Java和Go兩種客戶端代碼,Java版本與之前大同小異。

package com.funtest.javatest;import com.funtester.frame.SourceCode;import com.funtester.socket.WebSocketFunClient;public class WebSocketT extends SourceCode {    public static void main(String[] args) {        WebSocketFunClient instance = WebSocketFunClient.getInstance("ws://localhost:1234/websocket");        instance.connect();        instance.send("你好,我是FunTester - Java ,Have Fun ~ Tester !");    }}

下面是Go版本的客戶端

// TestWebSocket// @Description: 測(cè)試WebSocket腳本// @param tfunc TestWebSocket(t *testing.T) {    url := "ws://localhost:1234/websocket"    c, res, err := websocket.DefaultDialer.Dial(url, nil)    if err != nil {        log.Fatal("連接失敗:", err)    }    log.Printf("響應(yīng):%s", fmt.Sprint(res))    defer c.Close()    done := make(chan struct{})    err = c.WriteMessage(websocket.TextMessage, []byte("你好,我是FunTester"))    if err != nil {        fmt.Println(err)    }    for {        _, message, err := c.ReadMessage()        if err != nil {            log.Fatal(err)            break        }        log.Printf("收到消息: %s", message)    }    <-done}

測(cè)試

老規(guī)矩先啟動(dòng)服務(wù)端,后啟動(dòng)客戶端。

服務(wù)端日志:

=== RUN   TestWEBs[::1]:59843 sent: 你好,我是FunTester127.0.0.1:59902 receive: 你好,我是FunTester - Java ,Have Fun ~ Tester !

Go客戶端日志:

=== RUN   TestWebSocket2021/11/15 11:47:26 響應(yīng):&{101 Switching Protocols 101 HTTP/1.1 1 1 map[Connection:[Upgrade] Sec-Websocket-Accept:[5PGBd7voA/Wg2LVYY647eVMXRZc=] Upgrade:[websocket]] {0xc0003c6600} 0 [] false false map[] 0xc000474100 }2021/11/15 11:47:26 收到消息: 你好,我是FunTester

Java客戶端日志:

INFO-> main 當(dāng)前用戶:oker,工作目錄:/Users/oker/IdeaProjects/funtester/,系統(tǒng)編碼格式:UTF-8,系統(tǒng)Mac OS X版本:10.16INFO-> main FunTester_0 開始連接...INFO-> WebSocketConnectReadThread-14 FunTester_0 正在建立socket連接...INFO-> WebSocketConnectReadThread-14 握手信息key: Connection ,value: UpgradeINFO-> WebSocketConnectReadThread-14 握手信息key: Sec-WebSocket-Accept ,value: qMHB4r/HCWEGF2o/jgY7KDvPyS0=INFO-> WebSocketConnectReadThread-14 握手信息key: Upgrade ,value: websocketINFO-> main FunTester_0 連接成功!INFO-> WebSocketConnectReadThread-14 FunTester_0收到: 你好,我是FunTester - Java ,Have Fun ~ Tester !

PS:Go語言在WebSocket測(cè)試中比Java強(qiáng)太多,以后WebSocket的功能或者性能測(cè)試,我應(yīng)該會(huì)更傾向于用Go實(shí)現(xiàn)。前兩天做了測(cè)試,Go語言幾分鐘內(nèi)就能啟動(dòng)3萬鏈接,而Java,支撐不到這么多。

歡迎關(guān)注FunTester,Have Fun ~ Tester !