答案:Go通过net包实现UDP通信,使用net.ListenUDP接收数据,net.DialUDP发送数据。示例包含服务器监听127.0.0.1:8080接收并响应消息,客户端发送“Hello UDP Server!”并接收回复。关键点包括UDP无连接特性、地址解析、读写方式及应用层可靠性处理,适用于日志、心跳等场景。

在Golang中实现UDP数据的发送与接收非常直接,得益于标准库net包对UDP协议的良好支持。你可以使用net.ListenUDP来监听UDP端口接收数据,用net.DialUDP或net.Conn接口发送数据。下面分步骤说明如何实现。
要接收UDP数据,需要先绑定到一个本地地址和端口,然后持续读取数据包。
示例代码:
<font face="Courier New">package main
import (
"fmt"
"net"
)
func main() {
// 绑定本地地址
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
if err != nil {
panic(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
panic(err)
}
defer conn.Close()
fmt.Println("UDP服务器已启动,等待数据...")
buffer := make([]byte, 1024)
for {
n, clientAddr, err := conn.ReadFromUDP(buffer)
if err != nil {
fmt.Println("读取错误:", err)
continue
}
fmt.Printf("收到来自 %s 的消息: %s\n", clientAddr, string(buffer[:n]))
// 可选:回复客户端
response := "收到: " + string(buffer[:n])
conn.WriteToUDP([]byte(response), clientAddr)
}
}</font>客户端通过连接目标UDP地址,发送数据报文。
立即学习“go语言免费学习笔记(深入)”;
示例代码:
<font face="Courier New">package main
import (
"fmt"
"net"
)
func main() {
// 解析服务端地址
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
if err != nil {
panic(err)
}
// 建立UDP连接
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
panic(err)
}
defer conn.Close()
message := "Hello UDP Server!"
_, err = conn.Write([]byte(message))
if err != nil {
fmt.Println("发送失败:", err)
return
}
fmt.Println("已发送:", message)
// 接收服务器响应
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("接收响应失败:", err)
return
}
fmt.Println("收到响应:", string(buffer[:n]))
}</font>无连接特性:UDP是无连接协议,每次发送的数据报独立存在,不保证顺序和可靠性。
地址解析:net.ResolveUDPAddr用于将字符串地址转为*net.UDPAddr类型,是建立通信的前提。
读写方式:
上述例子实现了请求-响应模式。虽然UDP本身不维护连接,但通过记录客户端地址,服务器可以回发消息,模拟双向通信。
注意:由于UDP不保证送达,如需可靠性,需在应用层添加重传、确认等机制。
基本上就这些。Go的标准库让UDP编程变得简洁高效,适合日志传输、心跳包、DNS查询等场景。
以上就是如何在Golang中实现UDP数据发送与接收的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号