贝利信息

如何在Golang中处理UDP数据_Golang net包UDP通信示例

日期:2026-01-22 00:00 / 作者:P粉602998670
UDP服务端需用net.ListenUDP监听,调用SetReadDeadline设超时,ReadFromUDP读取并用addr回复;客户端用net.DialUDP发请求后Read收响应;缓冲区应设65536防截断。

UDP服务端如何正确监听并读取数据

Go 的 net.ListenUDP 返回的 *UDPConn 是阻塞式连接,调用 ReadFromUDP 会一直等待直到收到数据包。如果没做超时控制,程序可能卡死在读取阶段。

conn, _ := net.ListenUDP("udp", &net.UDPAddr{Port: 8080})
defer conn.Close()
buf := make([]byte, 65536)
for {
    n, addr, err := conn.ReadFromUDP(buf)
    if err != nil {
        if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
            con

tinue // 超时,继续下一轮 } log.Println("read error:", err) continue } log.Printf("received %d bytes from %v: %s", n, addr, string(buf[:n])) }

UDP客户端如何发送并接收响应

UDP 是无连接协议,客户端无需“建立连接”,但要发请求 + 等响应,需自己管理对端地址和读取逻辑。常见错误是只调用 WriteToUDP 就结束,没预留时间收回复。

addr := &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 8080}
conn, _ := net.DialUDP("udp", nil, addr)
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(3 * time.Second))
_, _ = conn.Write([]byte("ping"))
buf := make([]byte, 1024)
n, _ := conn.Read(buf)
log.Printf("got response: %s", string(buf[:n]))

为什么 ReadFromUDP 有时读不到完整包

根本原因是缓冲区太小 —— UDP 包超过缓冲长度时,多余字节被丢弃,且 ReadFromUDP 仍返回 n == len(buf),不会报错或提示截断。

UDP通信中地址复用与端口冲突问题

多个进程监听同一 UDP 端口默认失败,但可通过 SetReuseAddr(true) 允许 SO_REUSEADDR,常用于快速重启服务或负载分发场景。

真正容易被忽略的是:UDP 没有连接状态,所以没有 TIME_WAIT,但也没有 ACK 重传机制。发出去的包丢了,你根本不知道。