Golang 实现简单 UDP 服务端与客户端示例
利用 Golang 标准库中的 net 包可以实现极简的 UDP 服务端与客户端程序。本文展示了如何通过 ListenUDP 进行服务监听以及通过 DialUDP 建立点对点连接,包含完整的错误处理、数据收发与地址解析逻辑。
服务端实现
UDP 是一种无连接协议,严格意义上并不区分服务端和客户端,但在实际开发中通常将始终在后台运行的监听者称为服务端。核心步骤包括创建监听套接字、进入循环读取数据、解析远程地址并返回响应。
第一步:创建并绑定监听端口
目的:初始化一个能接收 UDP4 协议的套接字并绑定到指定本地 IP 和端口(如 8080)。
动作:调用 net.ListenUDP("udp4", ...)。这里指定 IP 为 net.IPv4(0, 0, 0, 0) 以监听所有网卡接口,Port 设为 8080。
状态:若 err != nil 则退出程序;否则通过 defer socket.Close() 确保程序结束时释放资源。
第二步:循环读取与响应
目的:持续接收客户端发来的数据并进行处理或回显。
入口:服务器端的无限 for 循环。
动作:
- 分配缓冲区
data := make([]byte, 4096)。 - 调用
socket.ReadFromUDP(data)阻塞直到有数据到达。该函数返回已读字节数read、远程发起请求的地址remoteAddr及错误信息err。 - 打印接收到的地址与原始内容,确认连通性。
- 准备返回数据
[]byte("hello client!"),调用socket.WriteToUDP(senddata, remoteAddr)将结果发回给刚才请求的那个客户端地址。
package main
import (
"fmt"
"net"
)
func main() {
// 创建监听
socket, err := net.ListenUDP("udp4", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
})
if err != nil {
fmt.Println("监听失败!", err)
return
}
defer socket.Close()
for {
// 读取数据
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("读取数据失败!", err)
continue
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n\n", data)
// 发送数据
senddata := []byte("hello client!")
_, err = socket.WriteToUDP(senddata, remoteAddr)
if err != nil {
return
fmt.Println("发送数据失败!", err)
}
}
}
客户端实现
客户端负责向特定的服务端地址发起 UDP 数据包传输,并在必要时等待服务器的回应。关键在于构造正确的目标 net.UDPAddr 结构体。
第一步:连接至服务端
目的:建立指向服务端 IP 和端口的通信通道。
动作:调用 net.DialUDP("udp4", nil, &net.UDPAddr{...})。此处假设服务端 IP 为 192.168.1.103,端口为 8080。第二个参数(本地地址)传入 nil 表示系统自动分配本地端口。
注意:需同样使用 defer 管理连接关闭。
第二步:发送并接收交互
目的:执行一次典型的“请求-响应”交互。
入口:连接成功后的代码段。
动作:
- 定义待发送字符串
"hello server!"并转化为[]byte类型。 - 调用
socket.Write(senddata)发出数据。由于已预先设置了远端地址,无需像服务端那样每次都指定目标。 - 准备缓冲区的
data用于存放回应。 - 调用
socket.ReadFromUDP(data)等待服务器反馈。此时获取到的remoteAddr即为服务端的返回地址。
package main
import (
"fmt"
"net"
)
func main() {
// 创建连接
socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
IP: net.IPv4(192, 168, 1, 103),
Port: 8080,
})
if err != nil {
fmt.Println("连接失败!", err)
return
}
defer socket.Close()
// 发送数据
senddata := []byte("hello server!")
_, err = socket.Write(senddata)
if err != nil {
fmt.Println("发送数据失败!", err)
return
}
// 接收数据
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("读取数据失败!", err)
return
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n", data)
}
简要总结
通过上述代码可以看出,Golang 处理 UDP 的核心在于对 net.UDPConn 对象的操作。服务端侧重于多路复用与被动响应,使用 ReadFromUDP 和 WriteToUDP;而客户端侧重于主动发起,配合预设好的远端地址进行单向写入及同步等待读取。在实际业务场景中,可根据需求扩展并发处理能力或使用自定义应用层协议。
以上就是Golang实现简单UDP协议服务端与客户端示例的详细内容,更多关于Golang UDP通信的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









