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

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

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

Go
炎炎设计 2023-05-08 16:26:07
我想弄清楚如何序列化一个结构并通过 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 }
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

在我的本地机器上实现了这个。是的,请检查您的错误,但幸运的是,没有返回任何内容。这是我为解决问题所做的工作。在send_udp初始化Buffer和EncoderINSIDE for 循环中。


func send_udp() error {

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

    if err != nil {

        return err

    }

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

    if err != nil {

        return err

    }

    defer conn.Close()


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

        // inside for loop

        var buf bytes.Buffer

        encoder := gob.NewEncoder(&buf)


        var msg int64 = int64(n) + 1

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

        err = encoder.Encode(packet)

        if err != nil {

            return err

        }

        _, err = conn.WriteTo(buf.Bytes(), dst)

        if err != nil {

            return err

        }

    }

    return nil

}

Buffer请注意,在for 循环外部声明时,实际上Packet每次添加新循环时都会发送前一个循环,因此当您在函数中n打印返回值时会增加值,但每次都只解码第一个循环。所以如果你打算一次发送它们,你将不得不在你的函数中循环。ReadFromUDPlisten_udpDecoderlisten_udp


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

添加回答

举报

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