Отправитель записывает 13 байтов перед кодированием gob ("newblock add "
).
Если получатель не считывает эти 13 байтов до декодирования гоба, то декодер будет не синхронизирован с потоком данных и сообщит об ошибке.
Метод чтения соединения возвращается, когда данныедоступно, фрагмент заполнен или произошла ошибка при чтении соединения. Игнорируя ошибки, вызов Read в соединении будет читать от 1 до len (recvdSlice) байтов соединения. Нет гарантии, что 13 байтов данных прочитаны, но на практике это часто происходит из-за хронометража.
Исправьте, прочитав только префикс перед декодированием гоба. Один из способов - разделить префикс новой строкой.
Измените код отправителя на:
_, _ = 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)