Golang使用UDP进行简单通信示例
发布时间 - 2026-01-09 00:00:00 点击率:次UDP客户端用net.DialUDP复用连接收发,需解析目标地址、设读超时、处理无响应;服务端用net.ListenUDP监听,每包启goroutine并发处理;跨机丢包主因防火墙或绑定127.0.0.1;需按最大包长分配缓冲区并自行定义消息边界。
UDP客户端如何发送并接收响应
Go 的 net.DialUDP 可以复用同一个连接收发,但要注意它默认不支持广播,且必须指定目标地址。常见错误是调用 WriteToUDP 时传入了 nil 地址,导致 panic:「write: invalid argument」。
实操建议:
- 先用
net.ResolveUDPAddr解析目标地址,避免手动拼接"127.0.0.1:8080"字符串出错 - 客户端应设置读超时(
SetReadDeadline),否则ReadFromUDP会永久阻塞 - 不要假设服务端一定回复——UDP 无连接、不可靠,需设计重试或超时逻辑
conn, _ := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 8080})
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(2 * time.Second))
conn.Write([]byte("hello"))
buf := make([]byte, 1024)
n, addr, _ := conn.ReadFromUDP(buf)
fmt.Printf("received %s from %v\n", string(buf[:n]), addr)UDP服务端如何正确监听并处理并发请求
用 net.ListenUDP 启动的服务端本身是单 goroutine 的,ReadFromUDP 是阻塞调用。若在主 goroutine 中循环读取,就无法同时处理多个请求——这不是 TCP,没有 accept 概念,但也不意味着天然并发。
关键点:
- 每个收到的包都应起独立 goroutine 处理,否则后续
ReadFromUDP被卡住 - 务必检查
ReadFromUDP返回的n,避免读到空数据或越界写入 - 服务端地址用
":8080"即可监听所有网卡,但生产环境建议绑定具体 IP
addr := &net.UDPAddr{Port: 8080}
conn, _ := net.ListenUDP("udp", addr)
defer conn.Close()
for {
buf := make([]byte, 1024)
n, clientAddr, err := conn.ReadFromUDP(buf)
if err != nil {
continue
}
go func(n int, addr *net.UDPAddr) {
// 处理逻辑,例如回写
conn.WriteToUDP([]byte("ack"), addr)
}(n, clientAddr)
}为什么 UDP 包在本地测试通,跨机器就丢包
最常见原因是防火墙拦截或端口未开放。Linux 上可通过 sudo ufw status 查看;macOS 检查「系统设置 → 隐私与安全性 → 防火墙」;Windows 则看「高级安全 Windows 防火墙」入站规则。
其他可能性:
- 服务端绑定了
127.0.0.1,只能本机访问;应改用""或0.0.0.0 - 路由器或云服务器安全组未放行 UDP 端口(注意:TCP 和 UDP 端口策略是分开的)
- 某些网络环境(如企业内网)会主动丢弃 UDP 小包,可尝试发大于 512 字节的数据验证
UDP 通信中如何避免缓冲区溢出和内存泄漏
Go 的 UDP 连接底层复用系统 socket,但每次 ReadFromUDP 都需提供足够大的缓冲区。若固定用 make([]byte, 1024),而对方发来 2KB 数据,多余部分直接被截断——UDP 不重传,也不会通知你丢包。
稳妥做法:
- 按业务最大可能包长分配 buffer(例如 DNS 最大 512B,自定义协议可设 64KB)
- 避免在 goroutine 中长期持有大 buffe
r;用 sync.Pool复用切片可降低 GC 压力 - 不要在循环里反复
make([]byte, ...),尤其高并发场景下易触发频繁堆分配
复杂点在于:UDP 没有消息边界保证,应用层需自行定义帧头(比如前 4 字节存长度),否则无法判断一个完整逻辑包是否收齐。这点常被忽略,直到出现粘包或半包问题才意识到。
# linux
# go
# windows
# golang
# 防火墙
# 云服务
# 字节
# ipad
# 路由器
# 端口
# mac
# 路由
# macos
# 字符串
# 循环
# 堆
# 切片
# nil
# 并发
# udp
# 云服务器
# 服务端
# 复用
# 客户端
# 绑定
# 也不
# 多个
# 这不是
# 但也
# 意识到
# 自定义
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
香港服务器网站推广:SEO优化与外贸独立站搭建策略
中山网站制作网页,中山新生登记系统登记流程?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
jquery插件bootstrapValidator表单验证详解
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Android Socket接口实现即时通讯实例代码
Laravel怎么使用Intervention Image库处理图片上传和缩放
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
网站建设要注意的标准 促进网站用户好感度!
进行网站优化必须要坚持的四大原则
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
装修招标网站设计制作流程,装修招标流程?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
bing浏览器学术搜索入口_bing学术文献检索地址
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何挑选优质建站一级代理提升网站排名?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel如何为API生成Swagger或OpenAPI文档
网页设计与网站制作内容,怎样注册网站?
中国移动官方网站首页入口 中国移动官网网页登录
清除minerd进程的简单方法
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
香港网站服务器数量如何影响SEO优化效果?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
微信小程序 canvas开发实例及注意事项
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
javascript日期怎么处理_如何格式化输出
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何用美橙互联一键搭建多站合一网站?
浅谈redis在项目中的应用
Laravel如何使用Blade模板引擎?(完整语法和示例)
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何用y主机助手快速搭建网站?
在线制作视频网站免费,都有哪些好的动漫网站?


r;用