Golang WebSocket 实现: 接收动态 JSON 数据并响应
使用 Golang 实现 WebSocket,不断接受不同时刻前端传输的不同 JSON 数据,如 {"input":"text","gender":1}、{"start_flag":true}、{"end_flag":true},且响应不同的数据内容:下面是一个使用 Golang 实现 WebSocket 的示例代码:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func websocketHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Failed to upgrade connection:", err)
return
}
for {
// 读取前端发送的消息
_, message, err := conn.ReadMessage()
if err != nil {
log.Println("Failed to read message:", err)
break
}
// 解析 JSON 数据
jsonData := make(map[string]interface{})
err = json.Unmarshal(message, &jsonData)
if err != nil {
log.Println("Failed to unmarshal JSON:", err)
continue
}
// 处理不同的消息类型
if input, ok := jsonData["input"].(string); ok {
// 处理输入文本消息
fmt.Println("Received input:", input)
// TODO: 做相应的处理
} else if startFlag, ok := jsonData["start_flag"].(bool); ok && startFlag {
// 处理开始标志消息
fmt.Println("Received start flag")
// TODO: 做相应的处理
} else if endFlag, ok := jsonData["end_flag"].(bool); ok && endFlag {
// 处理结束标志消息
fmt.Println("Received end flag")
// TODO: 做相应的处理
} else {
log.Println("Unknown message:", jsonData)
}
}
}
func main() {
http.HandleFunc("/websocket", websocketHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
在上面的代码中,我们使用 Gorilla WebSocket 库来实现 WebSocket 的功能。首先,我们定义了一个 upgrader 来升级 HTTP 连接为 WebSocket 连接。然后,在 websocketHandler 函数中,我们通过调用 upgrader.Upgrade 方法升级连接,并得到一个 websocket.Conn 对象。接下来,我们使用一个无限循环来不断读取前端发送的消息,并根据消息的不同类型进行处理。
在处理消息时,我们首先使用 json.Unmarshal 方法将消息解析为一个 map[string]interface{} 类型的对象。然后,我们根据消息中的键值对来判断消息的类型,并进行相应的处理。在示例代码中,我们假设输入消息中有一个键为 input 的字符串,开始标志消息中有一个键为 start_flag 的布尔值,结束标志消息中有一个键为 end_flag 的布尔值。你可以根据实际需求修改消息的类型和键名,并在相应的处理分支中添加你的业务逻辑。
最后,在 main 函数中,我们使用 http.HandleFunc 方法将 websocketHandler 函数注册为处理 /websocket 路径的 HTTP 请求的处理函数,并通过调用 http.ListenAndServe 方法来启动一个 HTTP 服务器。你可以根据需要修改监听的端口号。
原文地址: https://www.cveoy.top/t/topic/p1J2 著作权归作者所有。请勿转载和采集!