第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試使用 gob.Decoder() 解碼 blob 時出現(xiàn)錯誤

嘗試使用 gob.Decoder() 解碼 blob 時出現(xiàn)錯誤

Go
猛跑小豬 2023-07-31 10:51:58
我試圖將編碼的 blob 發(fā)送到本地對等點列表(在本地計算機上的多個端口偵聽的客戶端代碼),當我為某些對等點解碼 blob 時,它可以工作,但對于某些對等點則不能并顯示錯誤(gob:未知類型 ID 或損壞的數(shù)據(jù)),我該如何解決這個問題?//My blob structtype packet struct {    Nodes []a1.Node    Ledger *a1.Block    ActionType string}//Encoding Part    for i:=1; i<len(ConnectedNodes);i++{        var blob packet        blob.Ledger = Ledger        blob.ActionType = "AddBlock"        blob.Nodes = []a1.Node{}        conn, err := net.Dial("tcp", "localhost"+":"+ConnectedNodes[i].Port)        if err != nil {            // handle error            fmt.Println("Error At Client In Making A Connection (sending New Block to client "+ ConnectedNodes[i].Name +")")        }        //sending request type to client        _, _ = conn.Write([]byte("newblock add "))        //sending data to the client node        //gob.Register(blob)        encoder := gob.NewEncoder(conn)        error := encoder.Encode(blob)        if error != nil {            log.Fatal(error)        }    }//Decoding Part running on another peer//adds new block to the Ledger//Recieving incoming data    recvdSlice := make([]byte, 256)    conn.Read(recvdSlice)    RecievedData := string(recvdSlice)    finalData := strings.Split(RecievedData, " ")    if finalData[0] == "newblock"{        var blob packet        decoder := gob.NewDecoder(conn)        err := decoder.Decode(&blob)        if err != nil {            fmt.Println("error at decoding New Block on client!")            fmt.Println(err)        }        fmt.Println(Ledger.Hash)        fmt.Println(blob.Ledger.Hash)        if(bytes.Compare(Ledger.Hash, blob.Ledger.Hash)) == 0 {            fmt.Println("Ledger is already updated !")        }else{            fmt.Println("New Block Added !")            Ledger = blob.Ledger        }        a1.ListBlocks(Ledger)        //SendingNewBlockToConnectedNodes()    }
查看完整描述

1 回答

?
UYOU

TA貢獻1878條經(jīng)驗 獲得超4個贊

發(fā)送方在編碼 gob ( "newblock add ") 之前寫入 13 個字節(jié)。


如果接收器在解碼 gob 之前沒有讀取這 13 個字節(jié),則解碼器將與數(shù)據(jù)流不同步并報告錯誤。


當數(shù)據(jù)可用、切片已滿或讀取連接時出錯時,連接 Read 方法將返回。忽略錯誤,對連接上的 Read 的調(diào)用將從連接中讀取 1 到 len(recvdSlice) 個字節(jié)。雖然不能保證讀取到 13 字節(jié)的數(shù)據(jù),但由于時序原因,實際中這種情況經(jīng)常發(fā)生。


通過在解碼 gob 之前僅讀取前綴來修復。一種方法是用換行符分隔前綴。


將發(fā)件人代碼更改為:


 _, _ = conn.Write([]byte("newblock add \n"))

將接收者代碼更改為:


 br := bufio.NewReader(conn)

 receivedData, err := br.ReadString('\n')

 if err != nil {

     // handle error

 }

 finalData := strings.Split(receivedData, " ")


 if finalData[0] == "newblock"{

    var blob packet

    decoder := gob.NewDecoder(br) // <-- decode from the buffered reader

    err := decoder.Decode(&blob)

另一個修復方法是使用 gob 編解碼器作為前綴。將發(fā)件人更改為:


    encoder := gob.NewEncoder(conn)

    if err := encoder.Encode("newblock add "); err != nil {

        // handle error

    }

    if err := encoder.Encode(blob); err != nil {

        // handle error

    }

將接收器更改為:


decoder := gob.NewDecoder(conn)

var receivedData string

if err := decoder.Decode(&receivedData); err != nil {

     // handle error

}

finalData := strings.Split(receivedData, " ")


if finalData[0] == "newblock"{

    var blob packet

    err := decoder.Decode(&blob)


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號