Go UDP 服务端核心是 net.ListenUDP 绑定地址后循环 ReadFromUDP 读包;需预设缓冲区、处理 addr 并 WriteToUDP 回复;退出前调用 Close 释放资源。

用 Go 写 UDP 服务端很简单,核心就是调用 net.ListenUDP 绑定地址,再用循环读取数据包。
监听 UDP 端口
UDP 是无连接协议,不需要 accept,直接监听即可。常用方式是:
- 指定本地 IP 和端口,例如
:8080表示监听所有网卡的 8080 端口 - 使用
net.ListenUDP返回一个*net.UDPConn对象 - 注意:端口若被占用会报错,可先检查或用
net.ListenUDP("udp", &net.UDPAddr{Port: 0})让系统自动分配空闲端口
接收并处理数据包
UDP 每次收发都是独立的数据报(datagram),需为每次读取准备足够大的缓冲区(通常 1024 或 65535 字节 ):
- 用
conn.ReadFromUDP(buf)阻塞读取,返回实际读到的字节数和发送方地址 - 收到的数据不保证顺序、不保证到达,应用层需自行处理丢包或重复
- 建议对
buf[:n]做安全截取,避免越界访问
向客户端回复消息
UDP 支持单播回复,只需用上一步拿到的 *net.UDPAddr:
立即学习 “go 语言免费学习笔记(深入)”;
- 调用
conn.WriteToUDP([]byte("hello"), addr)即可发回 - 不需要预先“建立连接”,也不需要维护连接状态
- 如果只是丢弃请求、不回复,跳过这步即可
关闭与资源清理
服务运行中一般不主动关闭,但退出前应释放连接:
- 调用
conn.Close()释放 socket 资源 - 在信号捕获(如
os.Interrupt)中优雅关闭是常见做法 - 注意:Go 的 UDPConn 关闭后不能再读写,否则 panic
基本上就这些。UDP Server 不复杂但容易忽略错误处理和缓冲区边界,写的时候多留心。