document.writeln('');
当前位置:首页 > 云服务器

Golang使用UDP进行简单通信示例

游戏科技网2026年09月14日 21:43云服务器60
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 无连接、不可靠,需设计重试或超时逻辑

1

2

3

4

5

6

7

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 概念,但也不意味着天然并发。

关键点:

立即学习“go语言免费学习笔记(深入)”;

macOS Local Voice

利用 macOS 原生能力实现本地语音识别与合成。通过 yap (Apple Speech.framework) 进行语音转文字,通过 say + ffmpeg 进行文字转语音。完全离线,无需 API 密钥。具备音质检测与智能选声功能。

下载
  • 每个收到的包都应起独立 goroutine 处理,否则后续 ReadFromUDP 被卡住
  • 务必检查 ReadFromUDP 返回的 n,避免读到空数据或越界写入
  • 服务端地址用 ":8080" 即可监听所有网卡,但生产环境建议绑定具体 IP

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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 字节存长度),否则无法判断一个完整逻辑包是否收齐。这点常被忽略,直到出现粘包或半包问题才意识到。

“Golang使用UDP进行简单通信示例” 的相关文章

2021年云服务器优惠套餐推荐

2021年云服务器优惠套餐推荐 嗨,朋友们!你是否曾经在深夜里,面对一堆代码和服务器错误,感叹说:“为什么我的项目老是卡顿?”如果是这样的话,那你可能正在寻找2021年云服务器优惠套餐的解决方案。作为一名经常和这些技术打交道的爱好者,我深知选择一个合适的云服务器,就像挑选一件得体的衣服——它不仅要合身(性能匹配需求),还得实惠(价格亲民),才能让你在数字化浪潮中游刃有余。2021年,云计算市场迎来…

竟然有如此便宜的云服务器?

竟然有如此便宜的云服务器? 那天,我正坐在咖啡馆里,手里拿着笔记本电脑,本来想找个地方测试我的新网站。但我突然意识到,我需要一个稳定的服务器来托管它。过去,我一直以为云服务器至少要几百块钱一个月,结果一番搜索后,我愣住了——竟然有如此便宜的云服务器?有些服务商标价只要几十块钱就能用一个月,这简直是天方夜谭! 回想起来,去年我刚开始创业时,做了一个小型电子商务网站。起初,我用免费的共享主机,但速度慢…

云服务器特惠:选购与使用实战攻略

云服务器特惠:选购与使用实战攻略 嗨,大家好!我是小李,一个刚起步的创业公司老板。去年,我们团队开发了一个简单的网站,用来卖一些手工艺品。起初,一切都风平浪静,网站访问量不高,一台便宜的共享主机就能应付。但随着产品越来越受欢迎,我们的订单量直线上升,网站开始频繁卡顿,甚至偶尔崩溃。用户抱怨说,打开页面慢得让人等得心急。这让我意识到,我们需要升级服务器了。 那段时间,我像个热锅上的蚂蚁,到处找解决方…

(html)如何发布_发布HTML文件到网络的方法【网络】

(html)如何发布_发布HTML文件到网络的方法【网络】

可通过四种方式将HTML文件部署为公开网站:一、GitHub Pages免费托管;二、云存储服务(如阿里云OSS)启用静态网站托管;三、VPS配置Nginx/Apache服务器;四、Netlify/Vercel无服务器快速部署。 如果您已创建好一个 HTML 文件,但希望他人能通过互联网访问它,则需要将该文件部署到可公开访问的服务器上。以下是实现此目标的多种方法: 一、使用 GitHub Pa…

2021年云服务器优惠套餐活动

2021年云服务器优惠套餐活动 全球数字化转型浪潮持续深入,云计算作为新型基础设施建设的重要组成部分,其市场增长速度远超传统IT行业。根据Gartner最新发布的《中国云计算市场份额》报告显示,2020年第三季度至2021年第三季度期间,中国云计算市场规模从226亿美元增长至342亿美元,年复合增长率达30.7%。这一增长态势在2021年得到进一步巩固,各大云服务商纷纷推出优惠套餐以抢占市场份额。…

123云盘存储空间不够怎么办_123云盘存储空间扩容指南

123云盘存储空间不够怎么办_123云盘存储空间扩容指南

首先清理无用文件并清空回收站,其次压缩大文件、迁移数据至其他平台,再考虑升级账户容量,最后通过同步与归档策略优化空间使用。 如果您尝试在123云盘上保存或上传文件,但系统提示存储空间已满,则可能是由于当前账户的可用容量已达上限。以下是解决此问题的具体步骤: 本文运行环境:MacBook Pro,macOS Sonoma 一、清理无用文件与数据 通过移除不再需要的文件可以快速释放云盘空间,这是最…