如何在Golang中实现UDP数据发送与接收

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

在Golang中实现UDP数据的发送与接收非常直接,得益于标准库net包对UDP协议的良好支持。你可以使用net.ListenUDP来监听UDP端口接收数据,用net.DialUDPnet.Conn接口发送数据。下面分步骤说明如何实现。

创建UDP服务器接收数据

要接收UDP数据,需要先绑定到一个本地地址和端口,然后持续读取数据包。

示例代码:

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)
    }
}

创建UDP客户端发送数据

客户端通过连接目标UDP地址,发送数据报文。

示例代码:

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]))
}

关键点说明

无连接特性:UDP是无连接协议,每次发送的数据报独立存在,不保证顺序和可靠性。

地址解析net.ResolveUDPAddr用于将字符串地址转为*net.UDPAddr类型,是建立通信的前提。

读写方式

  • conn.ReadFromUDP 可获取发送方地址,适合服务器处理多个客户端
  • conn.WriteToUDP 向指定地址发送数据
  • 若使用DialUDP建立连接,则可直接用WriteRead

简单双向通信模型

上述例子实现了请求-响应模式。虽然UDP本身不维护连接,但通过记录客户端地址,服务器可以回发消息,模拟双向通信。

注意:由于UDP不保证送达,如需可靠性,需在应用层添加重传、确认等机制。

基本上就这些。Go的标准库让UDP编程变得简洁高效,适合日志传输、心跳包、DNS查询等场景。