写点什么

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

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

    阅读完需:约 7 分钟

学习完 HTTP 的基础,自然而然到了 WebSocket 协议,刚好前两天为了对比 Java 和 Go 两种语言 WebSocket 脚本性能,又实践了一遍,感觉自己已经行啦,特意来写篇文章记录一下。


先回顾一下 Java 和 Python 关于 Socket、WebSocket、Socket.IO 相关测试文章。



下面来分享一下 Go 语言进行 WebSocket 接口的开发和测试。

依赖

本文使用/net/websocket库,还有另外一个/gorilla/websocket等我完全熟练之后再来写文章分享。Go 语言的库有个最大的好处,就是同一个库既能做接口开发,也能当做客户端发送请求。

WebSocket 开发

这个地方有个大坑,网上查到的很多资料都已经过时,实际是无法运行的。原因是/net/websocket相对少用来做服务端的开发,有一篇错误文章被全网抄来抄去,极大影响了自学小白的体验。


这里服务端功能简单,功能设计如下:收到客户端消息之后,返回消息为当前时间。


// Echo// @Description:WebSocket接口handle// @param wsfunc Echo(ws *websocket.Conn) {  var err error  for {    var reply string    if err = websocket.Message.Receive(ws, &reply); err != nil {      fmt.Println("receive failed:", err)      break    }    log.Printf("收到消息:%s", reply)    msg := string(time.Now().String())    websocket.Message.Send(ws, msg)  }
}// TestSer// @Description: 创建一个WebSocket接口// @param tfunc TestSer(t *testing.T) { //接受websocket的路由地址 http.HandleFunc("/websocket", func(w http.ResponseWriter, req *http.Request) { s := websocket.Server{Handler: websocket.Handler(Echo)} s.ServeHTTP(w, req) }) if err := http.ListenAndServe(":1234", nil); err != nil {
log.Fatal("ListenAndServe:", err)
}}
复制代码


此处的大坑就是需要将 WebSocket 的 handle 转成 HTTP 的 handle,我个人理解相当于upgrader的过程。

客户端

这里只是简单给服务器发送一个消息,然后打印一下服务端返回的消息,由于服务端逻辑简单,所以客户端也非常简单。如果各位在实际测试当中,需要多结合chan进行 WebSocket 的测试,非常好用。


// TestWebSocket// @Description: 测试WebSocket脚本// @param tfunc TestWebSocket(t *testing.T) {
url := "wss://wspri.coinall.ltd:8443/ws/v5/public" 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) } go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Fatal(err) break } log.Printf("收到消息: %s", message)
} }() s := <-done fmt.Println(s)
}
复制代码

测试

首先启动服务端,然后启动客户端,Go 语言的启动速度相对 Java 也要快很多,优势明显。


我顺手也写了一个 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 !"); }}
复制代码


服务端日志:


=== RUN   TestSer2021/11/09 18:03:20 收到消息:你好,我是FunTester - Go ,Have Fun ~ Tester !2021/11/09 18:05:49 收到消息:你好,我是FunTester - Java ,Have Fun ~ Tester !
复制代码


Go 客户端日志:


=== RUN   TestMn22021-11-09 18:03:20.570277 +0800 CST m=+11.854257683
复制代码


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: mpWx5ntxvsNp75f8ubGZPmjSrn0=INFO-> WebSocketConnectReadThread-14 握手信息key: Upgrade ,value: websocketINFO-> main FunTester_0 连接成功!INFO-> WebSocketConnectReadThread-14 FunTester_0收到: 2021-11-09 18:05:49.374599 +0800 CST m=+43.517144103
复制代码

Have Fun ~ Tester !欢迎关注 FunTester

发布于: 1 小时前阅读数: 4
用户头像

FunTester

关注

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

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

评论

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