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

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

  • socket接口开发和测验初探
  • 根据WebSocket的client封装
  • 根据Socket.IO的Client封装
  • Socket接口固定QPS性能测验实践
  • 根据Socket.IO的白板点阵坐标传输接口测验实践
  • Socket接口异步验证实践
  • Socket.IO接口多用户测验实践
  • Python版Socket.IO接口测验脚本

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

依赖

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

WebSocket开发

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

这儿服务端功用简略,功用设计如下:收到客户端音讯之后,回来音讯为当前时刻。

// Echo
// @Description:WebSocket接口handle
// @param ws
func 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 t
func 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 t
func 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   TestSer
2021/11/09 18:03:20 收到音讯:你好,我是FunTester - Go ,Have Fun ~ Tester !
2021/11/09 18:05:49 收到音讯:你好,我是FunTester - Java ,Have Fun ~ Tester !

Go客户端日志:

=== RUN   TestMn2
2021-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.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: mpWx5ntxvsNp75f8ubGZPmjSrn0=
INFO-> WebSocketConnectReadThread-14 握手信息key: Upgrade ,value: websocket
INFO-> main FunTester_0 衔接成功!
INFO-> WebSocketConnectReadThread-14 FunTester_0收到: 2021-11-09 18:05:49.374599 +0800 CST m=+43.517144103

Have Fun ~ Tester !欢迎重视FunTester

  • 140道面试标题(UI、Linux、MySQL、API、安全)
  • 图解HTTP脑图
  • 共享一份Fiddler学习包
  • 线程池处理批量接口请求实践
  • 10万QPS,K6、Gatling和FunTester终极对决!
  • 性能瓶颈调优【粉丝投稿】
  • 如何选择API测验工具
  • 初学者的API测验技巧
  • API自动化测验攻略
  • API测验基础
  • 无数据驱动自动化测验
  • 自动化和手动测验,保持平衡!
  • 43种常见软件测验分类