Golang WebSocket 实战:接收 JSON 数据,响应处理,错误处理和 Token 校验
package main
import ( "fmt" "log" "net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { // 允许所有来源的请求升级为WebSocket连接 return true }, }
func main() { http.HandleFunc("/ws", handleWebSocket) log.Fatal(http.ListenAndServe(":8080", nil)) }
func handleWebSocket(w http.ResponseWriter, r *http.Request) { // 将HTTP连接升级为WebSocket连接 conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Failed to upgrade connection:", err) return } defer conn.Close()
// 处理WebSocket消息
for {
// 读取WebSocket消息
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Failed to read message:", err)
break
}
// 解析JSON数据
data := make(map[string]interface{})
err = json.Unmarshal(msg, &data)
if err != nil {
log.Println("Failed to parse JSON:", err)
continue
}
// 根据不同的数据类型进行处理
if input, ok := data["input"].(string); ok {
// 处理input字段
// TODO: 根据input字段的值进行相应的处理
response := map[string]interface{} {
"status": "success",
"input": input,
}
err = conn.WriteJSON(response)
if err != nil {
log.Println("Failed to send response:", err)
break
}
} else if startFlag, ok := data["start_flag"].(bool); ok {
// 处理start_flag字段
// TODO: 根据start_flag字段的值进行相应的处理
response := map[string]interface{} {
"status": "success",
"start_flag": startFlag,
}
err = conn.WriteJSON(response)
if err != nil {
log.Println("Failed to send response:", err)
break
}
} else if endFlag, ok := data["end_flag"].(bool); ok {
// 处理end_flag字段
// TODO: 根据end_flag字段的值进行相应的处理
response := map[string]interface{} {
"status": "success",
"end_flag": endFlag,
}
err = conn.WriteJSON(response)
if err != nil {
log.Println("Failed to send response:", err)
break
}
} else {
// 处理未知的数据类型
response := map[string]interface{} {
"status": "error",
"message": "Unknown data type",
}
err = conn.WriteJSON(response)
if err != nil {
log.Println("Failed to send response:", err)
break
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/p1TD 著作权归作者所有。请勿转载和采集!