为了账号安全,请及时绑定邮箱和手机立即绑定

使用 GOB 进行连续编码/解码

使用 GOB 进行连续编码/解码

Go
开满天机 2022-08-15 19:19:51
我是编程Golang Sockets的新手。当我尝试将一条消息从客户端发送到服务器时,它工作正常。但是,当我尝试发送连续10条消息时,我收到错误。要搜索的任何线索/关键字。请找到随附的示例代码。Server.gopackage mainimport (    "encoding/gob"    "fmt"    "net"    "os")func main() {    tcpAddr, err := net.ResolveTCPAddr("tcp4", ":5555")    checkError("ResolveTCPAddr", err)    listener, err := net.ListenTCP("tcp", tcpAddr)    checkError("ListenTCP", err)    conn, err := listener.Accept()    checkError("Accept", err)    for i := 0; i < 10; i++ {        var s string        dec := gob.NewDecoder(conn)        err = dec.Decode(&s)        checkError("Decode", err)        fmt.Println(s)    }}func checkError(info string, err error) {    if err != nil {        fmt.Fprintf(os.Stderr, info+": Run - Fatal error: %s\n", err.Error())        os.Exit(1)    }}客户端package mainimport (    "encoding/gob"    "fmt"    "net"    "os")func main() {    tcpAddr, err := net.ResolveTCPAddr("tcp4", ":5555")    checkError("ResolveTCPAddr", err)    conn, err := net.DialTCP("tcp", nil, tcpAddr)    checkError("DialTCP", err)    for i := 0; i < 10; i++ {        enc := gob.NewEncoder(conn)        err = enc.Encode("test")        checkError("Encode", err)    }}func checkError(info string, err error) {    if err != nil {        fmt.Fprintf(os.Stderr, info+": Run - Fatal error: %s\n", err.Error())        os.Exit(1)    }}屏幕:testtesttesttesttestDecode: Run - Fatal error: EOFexit status 1
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

问题在于解码器缓冲来自基础读取器的数据,并且缓冲数据可以包含来自流中稍后消息的数据。当应用程序丢弃解码器时,将丢弃缓冲的数据。稍后的解码器返回错误,因为它正在读取不完整的消息。


有一个简单的方法来解决这个问题。gob 包旨在读取和写入值流。在循环外部创建编码器和解码器,并让包处理消息成帧。


enc := gob.NewEncoder(conn)

for i := 0; i < 10; i++ {

    err = enc.Encode("test")

    checkError("Encode", err)

}



dec := gob.NewDecoder(conn)

for i := 0; i < 10; i++ {

    var s string

    err = dec.Decode(&s)

    checkError("Decode", err)

    fmt.Println(s)

}

如果由于某种原因必须在循环内创建编码器和解码器,则应用程序必须实现消息成帧,以防止解码器读取多个值。构建消息的一种方法是让客户端在 gob 编码值之前写入长度前缀。服务器读取长度,然后将解码器限制为读取该字节数。


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信