我是编程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 编码值之前写入长度前缀。服务器读取长度,然后将解码器限制为读取该字节数。
- 1 回答
- 0 关注
- 131 浏览
添加回答
举报
0/150
提交
取消