Go语言中的UDP编程是通过标准库net包提供的,该包提供了实现UDP协议的基本功能。
- 创建UDP服务器
通过调用net.ListenUDP()函数可以创建一个UDP服务器。该函数返回一个*UDPConn对象,表示UDP连接,它会监听指定地址和端口号上的数据包,并将其转发到处理程序。
addr, err := net.ResolveUDPAddr("udp", "localhost:8080")
if err != nil {
log.Fatal(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
buf := make([]byte, 1024)
for {
n, remoteAddr, err := conn.ReadFromUDP(buf)
if err != nil {
log.Println(err)
continue
}
go handleConnection(conn, remoteAddr, buf[:n])
}
func handleConnection(conn *net.UDPConn, remoteAddr *net.UDPAddr, data []byte) {
// 处理数据包
}
- 发送和接收数据
发送和接收数据可以使用*UDPConn对象提供的ReadFrom()和WriteTo()方法。
buf := make([]byte, 1024)
// 接收数据
n, remoteAddr, err := conn.ReadFrom(buf)
if err != nil {
log.Fatal(err)
}
data := buf[:n]
// 发送数据
_, err = conn.WriteTo(data, remoteAddr)
if err != nil {
log.Fatal(err)
}
- UDP粘包问题
由于不像TCP协议有明确的消息边界,因此在使用UDP传输时可能会出现粘包问题。同样地,可以在发送的数据中添加一个长度字段来解决这个问题。
// 发送数据
data := []byte("Hello, world!")
length := len(data)
buf := make([]byte, 4+length)
binary.BigEndian.PutUint32(buf[:4], uint32(length))
copy(buf[4:], data)
_, err = conn.WriteToUDP(buf, remoteAddr)
if err != nil {
log.Fatal(err)
}
// 接收数据
buf := make([]byte, 1024)
n, remoteAddr, err := conn.ReadFromUDP(buf)
if err != nil {
log.Fatal(err)
}
bufLen := binary.BigEndian.Uint32(buf[:4])
dataBuf := buf[4 : 4+bufLen]
data := string(dataBuf)




