• 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 !

  • 相关阅读:
    9 Fizz Buzz 问题
    2 尾部的零
    1 A+B问题
    递归
    互斥同步
    垃圾收集器与内存分配策略---垃圾收集算法
    10.矩形覆盖
    9.变态跳台阶
    8.跳台阶
    9.path Sum III(路径和 III)
  • 原文地址:https://www.cnblogs.com/FunTester/p/15594262.html
Copyright © 2020-2023  润新知