猿问

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

我正在关注大猩猩提供的聊天示例。

我仍然可以解组发送的 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() 方法不打印任何消息。完全迷失在这里。


犯罪嫌疑人X
浏览 115回答 1
1回答

慕尼黑5688855

应用程序通过循环在每次迭代中读取两条消息,并尝试将这两条消息解组为comment. 只读一条消息。应用程序调用ReadJSON不Unmarshal正确,从这些函数返回的错误解释了原因:应用程序试图解组为非指针。应用程序还将消息的原始字节发送到通道。看起来它可能是您正在复制的任何内容的剩余部分,因此我将在答案的其余部分忽略它。这是固定循环:for {&nbsp; &nbsp; var comment Comment&nbsp; &nbsp; err = c.conn.ReadJSON(&comment)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LogErr("IsUnexpectedCloseError()", err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; }&nbsp; &nbsp; // Do something with comment}
随时随地看视频慕课网APP

相关分类

Go
我要回答