猿问

序列化结构以通过 UDP 发送它

我想弄清楚如何序列化一个结构并通过 UDP 将它发送到我的服务器。我设法实际发送了该结构,但在收到时我没有任何值......除非我静态添加一个数字。


在下面的代码中,我将一个 UDP 数据包发送到端口 8080,其中的序号是 0-9 中的数字。我给它加上 + 1 来表明我的观点。我期望的是在接收端我应该在消息第 1-10 部分中收到。但我唯一收到的是数字 1,这意味着该变量应设置为 0。


为了验证我是否真的发送了 0,我打印了我收到的缓冲区的长度,它是它应该是的正确长度。所以我一定是在解码方面做错了什么。


发送功能:


func send_udp() {

    dst, _ := net.ResolveUDPAddr("udp", "localhost:8080")

    conn, _ := net.ListenPacket("udp", ":0")

    defer conn.Close()


    var buf bytes.Buffer

    encoder := gob.NewEncoder(&buf)

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

        var msg int64 = int64(n) + 1

        packet := &Packet{[]int{5}, msg}

        encoder.Encode(packet)

        conn.WriteTo(buf.Bytes(), dst)

    }

}

监听功能:


func listen_udp() {

    dst, _ := net.ResolveUDPAddr("udp", "localhost:8080")

    conn, _ := net.ListenUDP("udp", dst)

    defer conn.Close()


    for {

        buf := make([]byte, 4096)

        n, _, _ := conn.ReadFromUDP(buf[:])

        fmt.Println(n)

        dec := gob.NewDecoder(bytes.NewReader(buf[:n]))

        p := Packet{}

        dec.Decode(&p)

        if len(p.Parts) != 0 {

            fmt.Printf("Received: %+v\n", p)

        }

    }

}

我要发送的结构:


type Packet struct {

    Parts   []int 

    Message int64 

}


炎炎设计
浏览 116回答 1
1回答

湖上湖

在我的本地机器上实现了这个。是的,请检查您的错误,但幸运的是,没有返回任何内容。这是我为解决问题所做的工作。在send_udp初始化Buffer和EncoderINSIDE for 循环中。func send_udp() error {&nbsp; &nbsp; dst, err := net.ResolveUDPAddr("udp", "localhost:8080")&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; }&nbsp; &nbsp; conn, err := net.ListenPacket("udp", ":0")&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; }&nbsp; &nbsp; defer conn.Close()&nbsp; &nbsp; for n := 0; n < 10; n++ {&nbsp; &nbsp; &nbsp; &nbsp; // inside for loop&nbsp; &nbsp; &nbsp; &nbsp; var buf bytes.Buffer&nbsp; &nbsp; &nbsp; &nbsp; encoder := gob.NewEncoder(&buf)&nbsp; &nbsp; &nbsp; &nbsp; var msg int64 = int64(n) + 1&nbsp; &nbsp; &nbsp; &nbsp; packet := &Packet{[]int{5}, msg}&nbsp; &nbsp; &nbsp; &nbsp; err = encoder.Encode(packet)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; _, err = conn.WriteTo(buf.Bytes(), dst)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return nil}Buffer请注意,在for 循环外部声明时,实际上Packet每次添加新循环时都会发送前一个循环,因此当您在函数中n打印返回值时会增加值,但每次都只解码第一个循环。所以如果你打算一次发送它们,你将不得不在你的函数中循环。ReadFromUDPlisten_udpDecoderlisten_udp
随时随地看视频慕课网APP

相关分类

Go
我要回答