1 回答

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)
- 1 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報(bào)