Go WebSocket開發與測試實踐【gorilla/websocket】


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

文章引用

Golang 官方標准庫實現的 websocket 在功能上有些欠缺,本次介紹的 gorilla/websocket 庫,是Gorilla出品的速度快、質量高,並且被廣泛使用的 websocket 庫,很好的彌補了標准庫功能上的欠缺。

依賴

github.com/gorilla/websocket v1.4.2

WebSocket開發

跟Go官方標准庫實現有一點較大區別就是需要Upgrader對象,用來處理將HTTP請求升級為WebSocket請求,創建比較簡單,下面是Demo:

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

下面是創建WebSocket服務的代碼:

// TestWEBs 創建一個WebSocket服務
// @Description:
// @param t
func 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: 測試WebSocket腳本
// @param t
func 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("響應:%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
}

測試

老規矩先啟動服務端,后啟動客戶端。

服務端日志:

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

Go客戶端日志:

=== RUN   TestWebSocket
2021/11/15 11:47:26 響應:&{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 <nil>}
2021/11/15 11:47:26 收到消息: 你好,我是FunTester

Java客戶端日志:

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

PS:Go語言在WebSocket測試中比Java強太多,以后WebSocket的功能或者性能測試,我應該會更傾向於用Go實現。前兩天做了測試,Go語言幾分鍾內就能啟動3萬鏈接,而Java,支撐不到這么多。

歡迎關注FunTester,Have Fun ~ Tester !


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM