UDP是一种无连接的传输层协议,不需要像TCP那样建立连接就可以直接发送数据,在Golang中可以通过标准库的net包快速实现UDP通信功能,下面先介绍具体的实现方式。

UDP通信的基本原理
UDP通信不需要提前建立连接,通信双方只需要知道对方的IP地址和端口号就可以直接发送数据包。在Golang中,UDP通信的核心是通过net.ListenUDP创建监听套接字,通过ReadFromUDP和WriteToUDP方法完成数据的接收和发送。
UDP服务端实现
UDP服务端需要先监听指定的端口,然后循环接收客户端发送的数据,收到数据后可以选择给客户端返回响应。下面是完整的服务端代码示例:
package main
import (
"fmt"
"net"
"os"
)
func main() {
// 定义监听的地址和端口
listenAddr := &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0), // 监听所有网卡
Port: 8080,
}
// 创建UDP监听
conn, err := net.ListenUDP("udp", listenAddr)
if err != nil {
fmt.Printf("创建UDP监听失败: %vn", err)
os.Exit(1)
}
defer conn.Close()
fmt.Println("UDP服务端已启动,监听端口8080")
buf := make([]byte, 1024)
for {
// 接收客户端数据
n, clientAddr, err := conn.ReadFromUDP(buf)
if err != nil {
fmt.Printf("接收数据失败: %vn", err)
continue
}
fmt.Printf("收到来自 %v 的消息: %sn", clientAddr, string(buf[:n]))
// 给客户端返回响应
response := []byte("服务端已收到你的消息")
_, err = conn.WriteToUDP(response, clientAddr)
if err != nil {
fmt.Printf("发送响应失败: %vn", err)
}
}
}
UDP客户端实现
UDP客户端不需要提前建立连接,只需要创建UDP套接字,然后直接向服务端的地址发送数据即可,也可以接收服务端的响应。下面是完整的客户端代码示例:
package main
import (
"fmt"
"net"
"os"
)
func main() {
// 定义服务端的地址和端口
serverAddr := &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 8080,
}
// 创建UDP连接
conn, err := net.DialUDP("udp", nil, serverAddr)
if err != nil {
fmt.Printf("创建UDP连接失败: %vn", err)
os.Exit(1)
}
defer conn.Close()
// 发送消息到服务端
sendMsg := []byte("你好,我是UDP客户端")
_, err = conn.Write(sendMsg)
if err != nil {
fmt.Printf("发送消息失败: %vn", err)
return
}
fmt.Println("消息已发送到服务端")
// 接收服务端的响应
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("接收响应失败: %vn", err)
return
}
fmt.Printf("收到服务端响应: %sn", string(buf[:n]))
}
代码运行说明
运行上述代码时,需要先启动服务端程序,再启动客户端程序。服务端启动后会监听8080端口,客户端启动后会向本地8080端口发送消息,服务端收到消息后会打印客户端地址和消息内容,同时返回响应,客户端收到响应后也会打印出来。
注意事项
- UDP是无连接的协议,不保证数据的可靠传输,可能会出现丢包、乱序的情况,不适合对数据可靠性要求高的场景。
- 接收数据的缓冲区大小需要根据实际业务场景设置,避免缓冲区过小导致数据被截断。
- 如果服务端需要同时处理多个客户端的请求,上述代码已经支持,因为UDP本身不需要为每个客户端维护连接状态。