Golang 实现简单 UDP 服务端与客户端示例

不晚
不晚
发布时间:2026-10-13| 5人浏览过
原创

利用 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通信的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。