为了账号安全,请及时绑定邮箱和手机立即绑定

Gorilla websocket 如何将二进制数据解组为 JSON?

Gorilla websocket 如何将二进制数据解组为 JSON?

Go
犯罪嫌疑人X 2023-05-08 14:40:59
我正在关注大猩猩提供的聊天示例。我仍然可以解组发送的 json 数据。我应该在readPump():func (c *ChatClient) readPump() {    defer func() {        c.hub.unregisterChan <- c        c.conn.Close()    }()    c.conn.SetReadLimit(maxMessageSize)    c.conn.SetReadDeadline(time.Now().Add(pongWait))    c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil })    for {        _, message, err := c.conn.ReadMessage()        // =================MY CODE START=============        var comment Comment        err = c.conn.ReadJSON(comment)        if err != nil {            LogErr("readjson()", err)            break        }        err = json.Unmarshal(message, comment)        if err != nil {            LogErr("readjson()", err)            break        }        // =================MY CODE END=============        if err != nil {            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {                LogErr("IsUnexpectedCloseError()", err)            }            break        }        message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))        c.hub.broadcastChan <- message    }}或在writePump()func (c *ChatClient) writePump() {    ticker := time.NewTicker(pingPeriod)    defer func() {        ticker.Stop()        c.conn.Close()    }()    for {        select {        case message, ok := <-c.send:            c.conn.SetWriteDeadline(time.Now().Add(writeWait))            // CLOSE            if !ok {                c.conn.WriteMessage(websocket.CloseMessage, []byte{})                return            }            w, err := c.conn.NextWriter(websocket.BinaryMessage)            if err != nil {                LogErr("c.conn.NextWriter", err)                return            }LogErr() 方法不打印任何消息。完全迷失在这里。
查看完整描述

1 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

应用程序通过循环在每次迭代中读取两条消息,并尝试将这两条消息解组为comment. 只读一条消息。


应用程序调用ReadJSON不Unmarshal正确,从这些函数返回的错误解释了原因:应用程序试图解组为非指针。


应用程序还将消息的原始字节发送到通道。看起来它可能是您正在复制的任何内容的剩余部分,因此我将在答案的其余部分忽略它。


这是固定循环:


for {

    var comment Comment

    err = c.conn.ReadJSON(&comment)

    if err != nil {

        if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {

            LogErr("IsUnexpectedCloseError()", err)

        }

        break

    }

    // Do something with comment

}


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信