在Go中使用UDP的客户端/服务器

时间:2014-10-01 21:02:39

标签: go udp

我正在使用gob从客户端向服务发送消息,这是有效的,但是当服务器响应客户端时,这不会从连接中读取。

func servidor(porta int){
var site string

addr := net.UDPAddr{
    Port: porta,
    IP: net.ParseIP("localhost"),
}

conn, erro := net.ListenUDP("udp", &addr)
verificaErro(erro)

enc := gob.NewEncoder(conn)
dec := gob.NewDecoder(conn)

dec.Decode(&site)

enc.Encode(site)

}

func cliente(site string){
porta := "1200"
conn := ConnectToSocket("localhost:"+porta)

enc := gob.NewEncoder(conn)
dec := gob.NewDecoder(conn)

enc.Encode("Test")
dec.Decode(&site)

fmt.Println(site)

}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

有两个问题:

  • UDP是一种基于数据包的协议,但是gob期待一个流。编码值时,编码器可以多次调用连接Write方法。每个写发送一个数据包。您可能需要每个编码值一个数据包。
  • Gob溪流有州。编码器一次发送任何类型的信息,并期望解码器记住该信息。即使gob编码器每个编码值只调用一次Write,后续写入发送的数据包也不会包含类型信息。

修复是编码到缓冲区并发送缓冲区:

var buf Bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(value); err != nil {
   // handle error
}
_, err := c.WriteTo(buf.Bytes(), addr)

接收缓冲区并从该缓冲区解码:

buf := make([]byte, 1024)
n, addr, err := c.ReadFrom(buf)
if err != nil {
   // handle error
}
if err := gob.NewDecoder(bytes.NewReader(buf[:n])).Decode(&v); err != nil {
   // handle error
}