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 中长期持有大 buffer;用 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主机助手快速搭建网站?  在线制作视频网站免费,都有哪些好的动漫网站?