使用 Golang 实现 WebSocket 接收 JSON 数据并响应:示例、错误处理和 Token 校验
{ "title": "使用 Golang 实现 WebSocket 接收 JSON 数据并响应:示例、错误处理和 Token 校验", "description": "本文提供使用 Golang 实现 WebSocket 服务器的示例代码,展示如何接收前端不同时刻传输的不同 JSON 数据,如 {"input":"text","gender": 1}、{"start_flag":true}、{"end_flag":true},并根据数据类型进行不同的响应。同时,还介绍了与前端的错误处理协议和 Token 校验的实现方法。", "keywords": "Golang, WebSocket, JSON, 数据接收, 响应, 错误处理, Token 校验", "content": "package main\n\nimport (\n\t"fmt"\n\t"log"\n\t"net/http"\n\t"sync"\n\n\t"github.com/gorilla/websocket"\n)\n\n// 定义WebSocket连接的升级器\nvar upgrader = websocket.Upgrader{\n\tCheckOrigin: func(r *http.Request) bool {\n\t return true\n\t},\n}\n\n// 定义WebSocket连接结构体\ntype WebSocketConnection struct {\n\tconn *websocket.Conn\n\tlock sync.Mutex\n}\n\n// 处理WebSocket连接的读写操作\nfunc (wsConn *WebSocketConnection) handleConnection() {\n\tfor {\n\t // 读取消息\n\t _, msg, err := wsConn.conn.ReadMessage()\n\t if err != nil {\n\t log.Println("Read message error:", err)\n\t break\n\t }\n\n\t // 解析JSON数据\n\t data := make(map[string]interface{})\n\t err = json.Unmarshal(msg, &data)\n\t if err != nil {\n\t log.Println("JSON unmarshal error:", err)\n\t continue\n\t }\n\n\t // 处理不同类型的消息\n\t if input, ok := data["input"].(string); ok {\n\t // 处理输入文本消息\n\t if gender, ok := data["gender"].(int); ok {\n\t // 处理输入文本和性别的消息\n\t // TODO: 处理逻辑\n\t response := map[string]interface{}{\n\t "result": "success",\n\t }\n\t wsConn.sendResponse(response)\n\t } else {\n\t log.Println("Invalid gender")\n\t }\n\t } else if startFlag, ok := data["start_flag"].(bool); ok {\n\t // 处理开始标志消息\n\t // TODO: 处理逻辑\n\t response := map[string]interface{}{\n\t "result": "success",\n\t }\n\t wsConn.sendResponse(response)\n\t } else if endFlag, ok := data["end_flag"].(bool); ok {\n\t // 处理结束标志消息\n\t // TODO: 处理逻辑\n\t response := map[string]interface{}{\n\t "result": "success",\n\t }\n\t wsConn.sendResponse(response)\n\t } else {\n\t log.Println("Invalid message")\n\t }\n\t}\n\n\t// 关闭连接\n\twsConn.conn.Close()\n}\n\n// 发送响应消息\nfunc (wsConn *WebSocketConnection) sendResponse(response map[string]interface{}) {\n\twsConn.lock.Lock()\n\tdefer wsConn.lock.Unlock()\n\n\t// 将响应数据转换为JSON格式\n\tmsg, err := json.Marshal(response)\n\t if err != nil {\n\t log.Println("JSON marshal error:", err)\n\t return\n\t }\n\n\t// 发送响应消息\n\t err = wsConn.conn.WriteMessage(websocket.TextMessage, msg)\n\t if err != nil {\n\t log.Println("Write message error:", err)\n\t }\n}\n\n// WebSocket处理函数\nfunc websocketHandler(w http.ResponseWriter, r *http.Request) {\n\t// 升级HTTP连接为WebSocket连接\n\tconn, err := upgrader.Upgrade(w, r, nil)\n\t if err != nil {\n\t log.Println("Upgrade error:", err)\n\t return\n\t }\n\n\t// 创建WebSocket连接对象\n\twsConn := &WebSocketConnection{\n\t conn: conn,\n\t}\n\n\t// 处理WebSocket连接\n\twsConn.handleConnection()\n}\n\nfunc main() {\n\t// 注册WebSocket处理函数\n\thttp.HandleFunc("/websocket", websocketHandler)\n\n\t// 启动HTTP服务器\n\terr := http.ListenAndServe(":8080", nil)\n\t if err != nil {\n\t log.Fatal("HTTP server error:", err)\n\t }\n}
原文地址: https://www.cveoy.top/t/topic/p1Tv 著作权归作者所有。请勿转载和采集!