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

我是编程Golang Sockets的新手。当我尝试将一条消息从客户端发送到服务器时,它工作正常。但是,当我尝试发送连续10条消息时,我收到错误。要搜索的任何线索/关键字。请找到随附的示例代码。


Server.go


package main


import (

    "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 main


import (

    "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)

    }

}

屏幕:


test

test

test

test

test

Decode: Run - Fatal error: EOF

exit status 1


开满天机
浏览 132回答 1
1回答

MMMHUHU

问题在于解码器缓冲来自基础读取器的数据,并且缓冲数据可以包含来自流中稍后消息的数据。当应用程序丢弃解码器时,将丢弃缓冲的数据。稍后的解码器返回错误,因为它正在读取不完整的消息。有一个简单的方法来解决这个问题。gob 包旨在读取和写入值流。在循环外部创建编码器和解码器,并让包处理消息成帧。enc := gob.NewEncoder(conn)for i := 0; i < 10; i++ {&nbsp; &nbsp; err = enc.Encode("test")&nbsp; &nbsp; checkError("Encode", err)}dec := gob.NewDecoder(conn)for i := 0; i < 10; i++ {&nbsp; &nbsp; var s string&nbsp; &nbsp; err = dec.Decode(&s)&nbsp; &nbsp; checkError("Decode", err)&nbsp; &nbsp; fmt.Println(s)}如果由于某种原因必须在循环内创建编码器和解码器,则应用程序必须实现消息成帧,以防止解码器读取多个值。构建消息的一种方法是让客户端在 gob 编码值之前写入长度前缀。服务器读取长度,然后将解码器限制为读取该字节数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go