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


    学习完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 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

  • 相关阅读:
    php select socket
    php socket获取客户端IP地址
    php长连接
    Socket 深度探究 4 PHP (三)
    Socket 深度探究 4 PHP (二)
    Socket 深度探索 4 PHP (一)
    进阶系列(10)——反射
    ASP.NET MVC5 基础系列(2)——模型绑定
    进阶系列(7)——委托与事件
    ASP.NET MVC5 基础系列(4)——表单和HTML辅助方法
  • 原文地址:https://www.cnblogs.com/FunTester/p/15538500.html
Copyright © 2020-2023  润新知