dpikoto468637 2017-08-10 01:44
浏览 226

尝试在Golang中解码Gob时收到“缓冲区中的额外数据”错误

I'm encoding and sending multiple objects on a stream. I decode them as show in code below, keeping the connection open. I'm getting "extra data in buffer" error on the decode of all objects after the first.

func handleAggregatorConnection(conn net.Conn) {
        var connectionNumber = connectionCount
        connectionCount += 1
        log.Println("connection event: starting handle aggregator connection")


        dec := gob.NewDecoder(conn)

        var colorArrays map[string][]string
        colorArrayValue := &colorArrays

        var i P
        ai := &i


        for {
                //err := dec.Decode(colorArrayValue)
                err := dec.Decode(ai)
                if err == nil {
                        receivedColorResultFromAggregator = true
                        //log.Printf("received : %+v", colorArrayValue)
                        log.Println("received:", i)
                        aggregatorResultMap[connectionNumber] = *colorArrayValue
                        log.Println("control server: received object from aggregator ", aggregatorR\
esultMap)
                } else if err == io.EOF {
                        log.Println("reached end of stream while" +
                                "listening to aggregator")
                        delete(aggregatorResultMap, connectionNumber)
                        break
                } else {
                        log.Println("error decoding:", err)
                        break
                }
        }
        log.Println("connection event: closing aggregator connection")
        conn.Close()
}
  • 写回答

2条回答 默认 最新

  • dongwopu8210 2017-08-10 01:45
    关注

    Answering my own question: creating a new decoder for each decode operation makes it work.

    func handleAggregatorConnection(conn net.Conn) {
            var connectionNumber = connectionCount
            connectionCount += 1
            log.Println("connection event: starting handle aggregator connection")
    
            for {
    
                    dec := gob.NewDecoder(conn)
    
                    var colorArrays map[string][]string
                    colorArrayValue := &colorArrays
    
                    var i P
                    ai := &i
    
    
    
                    //err := dec.Decode(colorArrayValue)
                    err := dec.Decode(ai)
                    if err == nil {
                            receivedColorResultFromAggregator = true
                            //log.Printf("received : %+v", colorArrayValue)
                            log.Println("received:", i)
                            aggregatorResultMap[connectionNumber] = *colorArrayValue
                            log.Println("control server: received object from aggregator ", aggregatorR\
    esultMap)
                    } else if err == io.EOF {
                            log.Println("reached end of stream while" +
                                    "listening to aggregator")
                            delete(aggregatorResultMap, connectionNumber)
                            break
                    } else {
                            log.Println("error decoding:", err)
                            break
                    }
            }
            log.Println("connection event: closing aggregator connection")
            conn.Close()
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制