Golang中Gorilla websockets的writejson()方法在浏览器消息帧中返回字符串的问题

Golang中Gorilla websockets的writejson()方法在浏览器消息帧中返回字符串的问题 我正在实现WebSocket功能,希望发送经过编码的结构体对象。但是当我使用Gorilla WebSocket工具包中的WriteJSON或NextWriter方法进行编码时,数据以字符串形式传输。有没有办法可以直接发送JSON给客户端,这样客户端就不需要再解析数据了?

代码链接:https://play.golang.org/p/3jb0ENTLi7Y

WriteJSON代码片段:

for {
	for range ch {
		for _, con := range allConnection {
			c := OB{}
			c.Asks, c.Bids = GetPeparedVals()
			w, err := con.NextWriter(websocket.TextMessage)
			if err != nil {
				fmt.Println("encoding error")
				return
			}
			err = json.NewEncoder(w).Encode(&c)
			if err != nil {
				fmt.Println("sucks")
				w.Close()
				return
			}
		}

	}

}

更多关于Golang中Gorilla websockets的writejson()方法在浏览器消息帧中返回字符串的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

完全明白了,非常感谢你的帮助
愿上帝保佑你

更多关于Golang中Gorilla websockets的writejson()方法在浏览器消息帧中返回字符串的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


但是JSON是对象的字符串表示形式。然后你可以在客户端解码它并获取一个JavaScript对象。WebSocket只能以三种类型发送数据:字符串、Blob(只是一大块二进制数据)和ArrayBuffer(例如整数数组)。所以要在客户端解析数据,你只需要这样做:

mywebsocket.onmessage = function(event) {
  var msg = JSON.parse(event.data);

现在msg是一个JavaScript对象,你可以用它来访问字段,比如msg.orderID、msg.Book[33].Title等等。

还是我理解错了你的意思?

在Gorilla WebSocket中,WriteJSON方法已经能够正确发送JSON数据到客户端,但问题可能出现在您的实现方式上。当您使用NextWriter配合json.NewEncoder时,需要确保正确关闭writer并处理消息边界。

以下是正确的实现方式:

type OB struct {
    Asks [][]float64 `json:"asks"`
    Bids [][]float64 `json:"bids"`
}

func handleConnections() {
    for {
        for range ch {
            for _, conn := range allConnections {
                c := OB{}
                c.Asks, c.Bids = GetPreparedVals()
                
                // 方法1: 直接使用WriteJSON(推荐)
                err := conn.WriteJSON(c)
                if err != nil {
                    fmt.Println("WriteJSON error:", err)
                    continue
                }
                
                // 或者方法2: 使用NextWriter的正确方式
                /*
                writer, err := conn.NextWriter(websocket.TextMessage)
                if err != nil {
                    fmt.Println("NextWriter error:", err)
                    continue
                }
                
                encoder := json.NewEncoder(writer)
                if err := encoder.Encode(c); err != nil {
                    fmt.Println("Encoding error:", err)
                    writer.Close()
                    continue
                }
                
                if err := writer.Close(); err != nil {
                    fmt.Println("Close writer error:", err)
                }
                */
            }
        }
    }
}

在客户端JavaScript中,您应该这样处理:

websocket.onmessage = function(event) {
    // 直接解析JSON数据
    const data = JSON.parse(event.data);
    console.log('Asks:', data.asks);
    console.log('Bids:', data.bids);
};

关键点:

  1. WriteJSON会自动处理消息编码和writer管理
  2. 使用NextWriter时必须调用Close()来发送完整的消息帧
  3. WebSocket消息本身是文本格式,但内容已经是序列化的JSON数据

如果数据在浏览器端显示为字符串,检查客户端代码是否正确使用JSON.parse()来解析接收到的数据。WebSocket消息总是以字符串形式传输,但内容可以是有效的JSON格式。

回到顶部