1 回答

TA貢獻1878條經驗 獲得超4個贊
發送方在編碼 gob ( "newblock add ") 之前寫入 13 個字節。
如果接收器在解碼 gob 之前沒有讀取這 13 個字節,則解碼器將與數據流不同步并報告錯誤。
當數據可用、切片已滿或讀取連接時出錯時,連接 Read 方法將返回。忽略錯誤,對連接上的 Read 的調用將從連接中讀取 1 到 len(recvdSlice) 個字節。雖然不能保證讀取到 13 字節的數據,但由于時序原因,實際中這種情況經常發生。
通過在解碼 gob 之前僅讀取前綴來修復。一種方法是用換行符分隔前綴。
將發件人代碼更改為:
_, _ = 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 編解碼器作為前綴。將發件人更改為:
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 關注
- 160 瀏覽
添加回答
舉報