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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

Go
猛跑小豬 2023-07-31 10:51:58
我試圖將編碼的 blob 發(fā)送到本地對(duì)等點(diǎn)列表(在本地計(jì)算機(jī)上的多個(gè)端口偵聽的客戶端代碼),當(dāng)我為某些對(duì)等點(diǎn)解碼 blob 時(shí),它可以工作,但對(duì)于某些對(duì)等點(diǎn)則不能并顯示錯(cuò)誤(gob:未知類型 ID 或損壞的數(shù)據(jù)),我該如何解決這個(gè)問題?//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貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

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


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


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


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


將發(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)

另一個(gè)修復(fù)方法是使用 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)


查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 168 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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