我试图弄清楚如何序列化结构并将其通过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
}
答案 0 :(得分:1)
在我的本地计算机上实现了此功能。是的,请检查您的错误,但是对您来说很幸运,没有任何回报。这是我为解决此问题所做的工作。在send_udp
中,在for循环中初始化Buffer
和Encoder
。
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
时都会发送每个先前的n
,因此在打印返回值时,ReadFromUDP
的值会增加从listen_udp
函数中的Decoder
开始,但是每次都只解码第一个。因此,如果您打算一次全部发送它们,则必须在listen_udp
函数中循环let input = '00110010'
let array = input.split("").map(x => parseInt(x));
let sum = array.reduce((acc, val) => {
return acc + val;
});
console.log(sum)
。