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 关注
- 121 浏览
添加回答
举报