zoukankan      html  css  js  c++  java
  • 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 !

  • 相关阅读:
    通讯录封装实现
    简单通讯录的实现 main..h .m文件全部
    iOS 开发 OC编程 字典和集合 排序方法
    iOS 开发 OC编程 数组冒泡排序.图书管理
    iOS 开发 OC编程 属性和字符串练习
    iOS 开发 OC编程 属性和字符串
    iOS 开发 OC编程 便利构造器以及初始化方法
    iOS 开发 OC编程 方法的书写
    IOS 开发 OC编程 类和对象
    iOS 开发 c语言阶段考试题
  • 原文地址:https://www.cnblogs.com/FunTester/p/15594262.html
Copyright © 2011-2022 走看看