写点什么

Go WebSocket 开发与测试实践【gorilla/websocket】

作者:FunTester
  • 2021 年 11 月 23 日
  • 本文字数:2096 字

    阅读完需:约 7 分钟

前文提到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 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: 测试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("响应:%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: 你好,我是FunTester127.0.0.1:59902 receive: 你好,我是FunTester - Java ,Have Fun ~ Tester !
复制代码


Go 客户端日志:


=== RUN   TestWebSocket2021/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.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 测试中比 Java 强太多,以后 WebSocket 的功能或者性能测试,我应该会更倾向于用 Go 实现。前两天做了测试,Go 语言几分钟内就能启动 3 万链接,而 Java,支撑不到这么多。

欢迎关注 FunTester,Have Fun ~ Tester !

发布于: 23 小时前阅读数: 5
用户头像

FunTester

关注

公众号:FunTester,650+原创,欢迎关注 2020.10.20 加入

Have Fun,Tester! 公众号FunTester,坚持原创文章的测试人。 FunTester测试框架作者,DCS_FunTester分布式性能测试框架作者。

评论

发布
暂无评论
Go WebSocket开发与测试实践【gorilla/websocket】