Websocket

Websocket

推荐阅读: Websocket协议完整解析–知乎 使用Go语言创建WebSocket服务器和客户端 慢聊Go之GoLang中使用Gorilla Websocket

服务端

在常规的handle中使用websocket.Upgrader 获得一个websocketConn 用它的read和write处理信息即可 然后其他handle一样使用即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    // 解决跨域问题
    CheckOrigin: func(r *http.Request) bool {
        return true
	},
 
    /* 
	// 也可以在这里进行跨域的限制 返回true则允许访问 false则不允许
    // 根据需要加一些自己的判断,比如:
       CheckOrigin: func(r *http.Request) bool {
         return r.URL.Host == "localhost"
       },
    */
}

// 使用http包
// func webSocketHandler(w http.ResponseWriter, r *http.Request) {
// 	// 有一个弃用的方法 websocket.Upgrade() 该方法使用默认配置获取webSocket连接 不支持配置
// 	conn, err := upgrader.Upgrade(w, r, nil)
// 	if err != nil {
// 		return
// 	}
// 	defer conn.Close()
// }

// 使用gin
func ginWebSocketHandler(c *gin.Context) {
	// 有一个弃用的方法 websocket.Upgrade()
	wsConn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	if err != nil {
		panic(err)
	}

	// 处理WebSocket消息
	for {
		// 等待接收消息
		messageType, p, err := wsConn.ReadMessage()
		/*
			msgType 支持三种本地消息类型
			  1、文本消息
			  2、二进制消息
			  3、Ping消息 和 Pong消息、
		*/
		// 发送信息
		wsConn.WriteMessage(1, []byte("Hello, client!"))
		if err != nil {
			break
		}

		fmt.Println("messageType:", messageType)
		fmt.Println("p:", string(p))

		// 输出WebSocket消息内容
		c.Writer.Write(p)
	}

	defer wsConn.Close()
}

func main() {
	// 创建Gin应用
	app := gin.Default()

	// 注册WebSocket路由
	app.GET("/ws", ginWebSocketHandler)

	// 启动应用
	err := app.Run(":8080")
	if err != nil {
		panic(err)
	}
}

客户端

直接打开,也可以挂载到端口上,在console中使用ws.send(“信息”)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
</head>
<body>
    <h1>这是websocket前端<br/>请使用console进行测试</h1>
    <script>
        var ws = new WebSocket("ws://localhost:8080/ws");
        // 连接websocket时触发的函数
        ws.onopen = function() {
            console.log("WebSocket连接成功");
            // 发送信息
            ws.send('Hello, server');
        };

        // 监听ws消息 获取到之后打印
        ws.onmessage = function(event) {
            console.log("接收到信息: " + event.data);
        };
        
        // 关闭时触发
        ws.onclose = function() {
            console.log("WebSocket连接关闭");
        };

        // 报错时触发
        ws.onerror = function(event) {
            console.log("WebSocket error: " + event.data);
        };
    </script>
</body>
</html>

也可以用go做客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"fmt"

	"github.com/gorilla/websocket"
)

func main() {
	conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	for i := 0; i < 10; i++ {
		conn.WriteMessage(websocket.TextMessage, []byte("Hello, server!"))
		_, message, err := conn.ReadMessage()
		if err != nil {
			panic(err)
		}
		fmt.Println(string(message))
	}
}
updatedupdated2023-09-032023-09-03