UDP通信不需要建立连接,服务端和客户端可以直接通过IP地址和端口进行数据传输,在Golang中可以通过标准库的net包实现UDP的发送与接收功能。

Golang UDP通信基础
UDP通信的核心是通过net.UDPConn对象完成数据操作,该对象由net.ListenUDP函数创建,支持读取和写入UDP数据报。和TCP不同,UDP每次传输的数据都有长度限制,且无法保证数据一定能到达对端。
UDP接收端实现
接收端需要先监听指定的端口,等待接收客户端发送的数据,同时可以获取发送端的地址信息,用于后续回复数据。
接收端代码实现
package main
import (
"fmt"
"net"
)
func main() {
// 定义监听的本地地址,端口为8080
localAddr := &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
}
// 监听UDP端口,创建UDP连接对象
conn, err := net.ListenUDP("udp", localAddr)
if err != nil {
fmt.Printf("监听UDP端口失败: %vn", err)
return
}
defer conn.Close()
fmt.Println("UDP接收端已启动,监听端口8080")
// 定义接收数据的缓冲区,大小为1024字节
buf := make([]byte, 1024)
for {
// 读取客户端发送的数据,返回数据长度、客户端地址、错误信息
n, remoteAddr, err := conn.ReadFromUDP(buf)
if err != nil {
fmt.Printf("读取数据失败: %vn", err)
continue
}
// 打印接收到的数据和客户端地址
fmt.Printf("接收到来自 %v 的数据: %sn", remoteAddr, string(buf[:n]))
// 向客户端回复数据
replyMsg := []byte("已收到你的消息")
_, err = conn.WriteToUDP(replyMsg, remoteAddr)
if err != nil {
fmt.Printf("回复数据失败: %vn", err)
}
}
}
UDP发送端实现
发送端不需要提前监听端口,只需要创建UDP连接后,指定接收端的地址即可发送数据,也可以接收接收端回复的内容。
发送端代码实现
package main
import (
"fmt"
"net"
"time"
)
func main() {
// 定义接收端的地址,这里指向本地8080端口
remoteAddr := &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 8080,
}
// 创建UDP连接,本地地址设为nil,由系统自动分配端口
conn, err := net.DialUDP("udp", nil, remoteAddr)
if err != nil {
fmt.Printf("创建UDP连接失败: %vn", err)
return
}
defer conn.Close()
fmt.Println("UDP发送端已启动")
// 循环发送数据,每隔1秒发送一次
for i := 0; i < 5; i++ {
sendMsg := fmt.Sprintf("这是第 %d 条测试消息", i+1)
// 发送数据到接收端
_, err = conn.Write([]byte(sendMsg))
if err != nil {
fmt.Printf("发送数据失败: %vn", err)
break
}
fmt.Printf("已发送消息: %sn", sendMsg)
// 接收接收端的回复
buf := make([]byte, 1024)
// 设置读取超时时间为2秒
conn.SetReadDeadline(time.Now().Add(2 * time.Second))
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("接收回复失败: %vn", err)
} else {
fmt.Printf("接收到回复: %sn", string(buf[:n]))
}
time.Sleep(1 * time.Second)
}
}
UDP通信注意事项
- UDP数据报有大小限制,一般建议单次发送的数据不超过64KB,避免出现数据截断问题。
- UDP是无可靠传输协议,数据可能丢失、重复或者乱序,如果对数据可靠性要求高,需要自己在应用层实现重传、排序等逻辑。
- 使用
ReadFromUDP和WriteToUDP方法时,需要正确处理返回的地址信息,避免发送到错误的对端。 - 如果长时间没有数据交互,可以适当设置读取超时时间,避免程序无限阻塞。
常见问题解答
为什么发送端发送数据后接收不到回复
首先检查接收端是否正常启动并监听了正确的端口,其次确认发送端填写的接收端地址是否正确,还可以查看是否有防火墙拦截了UDP端口的数据传输。
如何同时处理多个客户端的UDP请求
UDP本身是无连接的,单个net.UDPConn对象就可以同时处理多个客户端的数据,通过ReadFromUDP返回的客户端地址区分不同的请求来源即可,不需要像TCP那样为每个客户端创建独立的连接。