我是编程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 关注
- 161 浏览
添加回答
举报
0/150
	提交
		取消
	