1 回答

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