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,支撑不到这么多。

下面是一份配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
在这里插入图片描述
这些都可以以在公众号:伤心的辣条 ! 免费领取,还有一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中资料包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

Guess you like

Origin blog.csdn.net/AI_Green/article/details/121493553
Go