新闻中心

如何用Golang实现UDP数据发送与接收_Golang UDP通信实践

2025-11-18
浏览次数:
返回列表
UDP是无连接协议,适用于实时性要求高的场景;Golang通过net包提供高效支持,使用ResolveUDPAddr解析地址,DialUDP或WriteToUDP发送数据,ListenUDP监听并用ReadFromUDP接收,可实现单播、广播或多播通信。

如何用golang实现udp数据发送与接收_golang udp通信实践

UDP(用户数据报协议)是一种无连接的传输层协议,适用于对实时性要求高、能容忍少量丢包的场景,比如音视频通信、监控系统或心跳探测。Golang标准库 net 包对 UDP 通信提供了简洁高效的封装,实现发送与接收非常方便。

创建UDP连接并发送数据

在 Golang 中,发送 UDP 数据前需要解析目标地址,并通过 net.DialUDP 或直接使用 net.UDPConn.WriteToUDP 发送。以下是一个发送字符串数据的示例:

package main

import (
    "net"
    "fmt"
)

func main() {
    // 解析服务器地址
    addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println("地址解析失败:", err)
        return
    }

    // 建立 UDP 连接
    conn, err := net.DialUDP("udp", nil, addr)
    if err != nil {
        fmt.Println("连接失败:", err)
        return
    }
    defer conn.Close()

    // 发送数据
    message := "Hello UDP Server"
    _, err = conn.Write([]byte(message))
    if err != nil {
        fmt.Println("发送失败:", err)
        return
    }

    fmt.Println("数据已发送:", message)
}

这段代码向本地 8080 端口发送一条消息。注意,UDP 是无连接的,DialUDP 只是建立了一个绑定远端地址的连接句柄,实际并不握手。

监听UDP端口并接收数据

接收端需绑定本地地址并持续监听数据包。使用 net.ListenUDP 创建一个 UDP 服务端,然后调用 ReadFromUDP 接收数据:

package main

import (
    "net"
    "fmt"
)

func main() {
    // 监听本地 8080 端口
    addr, err := net.ResolveUDPAddr("udp", ":8080")
    if err != nil {
        fmt.Println("地址解析失败:", err)
        return
    }

    conn, err := net.ListenUDP("udp", addr)
    if err != nil {
        fmt.Println("监听失败:", err)
        return
    }
    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 := "收到你的消息"
        conn.WriteToUDP([]byte(response), clientAddr)
    }
}

服务端持续从缓冲区读取数据,并打印来源地址和内容。也可以根据业务逻辑回传响应。

无需连接的发送方式(WriteToUDP)

如果不想维护连接状态,可以直接使用 WriteToUDP。这种方式更贴近 UDP 的无连接本质:

android rtsp流媒体播放介绍 中文WORD版 android rtsp流媒体播放介绍 中文WORD版

本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

android rtsp流媒体播放介绍 中文WORD版 1 查看详情 android rtsp流媒体播放介绍 中文WORD版
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: 0}) // 随机端口
if err != nil { panic(err) }
defer conn.Close()

dest, _ := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
_, err = conn.WriteToUDP([]byte("无连接发送"), dest)
if err != nil {
    fmt.Println("发送失败:", err)
}

这种模式适合一次性发包,如日志上报或广播通知。

处理广播与多播(可选扩展)

UDP 支持广播和多播通信。若要发送广播,确保目标地址为广播地址(如 255.255.255.255),并开启 socket 的广播选项:

conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4zero, Port: 9999})
// ... 设置广播选项需使用 syscall(略)
// 发送到 255.255.255.255:9999 实现局域网广播

多播则需加入特定组播组(如 224.0.0.1),适用于一对多消息分发。

基本上就这些。Golang 的 UDP 编程简单直接,重点在于地址解析、连接建立与读写控制。只要理解 UDP 无连接、不可靠但高效的特点,就能灵活应用于各类网络场景。不复杂但容易忽略的是错误处理和缓冲区大小设置,建议始终检查返回值并合理分配 buffer。

以上就是如何用Golang实现UDP数据发送与接收_Golang UDP通信实践的详细内容,更多请关注其它相关文章!


# 性要求  # 开源网站营销推广  # 房地产网站建设模板  # 金阊快照推广和网站制作  # 辽源seo助手哪家好用  # 苏州网站建设案例课堂  # 竞价推广招聘网站  # 校园网站建设哪家便宜  # 珠海做seo优化  # 广东安徽抖音关键词排名  # 地产营销推广提案模板  # 组播  # 是一个  # go  # 服务端  # 绑定  # 可选  # 如何用  # 的是  # 适用于  # 流媒体  # 标准库  # ai  # 端口  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  在Socket.IO连接中实现Access Token自动更新与动态重连  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  J*a递归快速排序中静态变量的状态管理与陷阱  Go语言中JSON数据解码与字段访问指南  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  iwriter统一登录平台 iwrite账号密码登录页面  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  2026年CSGO开箱网站推荐 CSGO开箱平台精选  HTML空白字符处理机制:渲染、DOM与编码实践  zookeeper 都有哪些功能?  快手网页版在线登录 快手网页版官网入口快速访问  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  windows10怎么关闭系统提示音_windows10彻底静音设置方法  Pyrogram与g4f集成:异步编程实践与常见错误解决  在VS Code中配置和运行Dart程序的完整步骤  AO3最新官网入口公告_2025AO3镜像站实时查询方法  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  解决Tabulator日期时间排序问题的专业指南  Kafka Streams中基于消息头条件过滤消息的实现指南  AO3最新可访问网址 Archive of Our Own官方在线入口  j*a toString()的覆盖  J*aScript异步迭代器_j*ascript异步遍历  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  Python大型XML文件高效流式解析教程  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  12306几点到几点不能订票? | 官方最新系统维护时间全解析  自定义Bag-of-Words实现:处理带负号的词汇权重  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  excel怎么制作工资条 excel快速生成工资条的方法  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  解决移动端滚动问题的overflow属性应用指南  uc浏览器网页版入口 uc浏览器网页版最新网址  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】 

搜索