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

标签 go gob

我正在尝试弄清楚如何序列化结构并通过 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 
}

最佳答案

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

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
}

请注意,在 for 循环之外声明 Buffer,实际上每次添加新的 Packet 时都会发送之前的每个 Packet,因此 n 值,当您在 listen_udp 函数中打印 ReadFromUDP 的返回值时,但它每次都只解码第一个。因此,如果您打算一次发送它们,则必须在 listen_udp 函数中遍历 Decoder

关于go - 序列化结构以通过 UDP 发送它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324046/

相关文章:

google-app-engine - Go例程泄漏在哪里?

go - 在范围循环中获取 {{.Host}} - Caddy 服务器浏览模板

go - 在 go 中按顺序将 protobuf 消息写入文件

serialization - 使用 Gob 以追加方式将日志写入文件

go - 测试使用 time.Ticker 的代码的正确方法?

json - 为什么 json.Unmarshal 返回一个映射而不是预期的结构?

go - Ragel 转换 Action 和状态 Action 之间的区别

go - 如何告诉 Golang Gob 编码可以序列化包含没有导出字段的结构的结构

encoding - 如何编码/解码空字符串

go - 将 int 数组转换为字节数组,压缩然后反转