golang中websocket数据处理和返回json数据示例, 直接上代码:
// @author tekintian@gmail.com
// golang websocket 数据处理和返回JSON数据示例,
// 这个函数返回 http.HandlerFunc
// 将http请求升级为websocket请求 这个需要依赖第三方包 go get github.com/gorilla/websocket
func WsHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
// 将普通链接转换为socket链接
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer ws.Close()
// 向websocket发送数据
_ = sendStats(ws, 1*time.Second)
}
return nil
}
// 向websocket发送json数据 注意这里的 for range ticker.C { 的使用
func sendStats(conn *websocket.Conn, frequency time.Duration) error {
ticker := time.NewTicker(frequency) // 定时器 在指定的时间间隔中执行
defer ticker.Stop() // 确保退出时关闭定时器
// 循环定时器管道,这里的for循环会 每个frequency执行一次
for range ticker.C {
w, err := conn.NextWriter(websocket.TextMessage)
if err != nil {
return err
}
if err := WriteValues(w); err != nil {
return err
}
if err := w.Close(); err != nil {
return err
}
}
}
// 同步写入锁
var mu sync.Mutex
func WriteValues(w io.Writer) error {
mu.Lock()
defer mu.Unlock()
// 定义并初始化要写到ws中的数据
m := map[string]any{
"a": "123",
"ts": time.Now().UnixMilli(),
}
// 其他信息写入
// 将数据m json编码后写入到w
if err := json.NewEncoder(w).Encode(m); err != nil {
return fmt.Errorf("failed to write/convert values to json: %v", err)
}
}