Golang UDP详解

一、UDP协议简介

UDP(User Datagram Protocol,用户数据报协议)是Internet传输层协议之一,与TCP(Transmission Control Protocol,传输控制协议)一样工作于 OSI模型的传输层。

和TCP不同的是,UDP不必在发数据前先建立连接,因此传输数据的速度更快,但是可靠性较差。而且处理的数据包大小也有限制,MTU通常为1500字节。

二、Golang对UDP协议的支持

Golang作为一门高效的语言,对网络编程的支持也很强大。它内置了对TCP和UDP协议的支持,并且提供了方便易用的API。

对于UDP协议,Golang提供了两种方式处理数据:

  • PacketConn:基于数据包的方式传输UDP数据
  • Conn:基于流的方式传输UDP数据

三、PacketConn方式的使用

PacketConn方式是以数据包(Packet)的形式传输UDP数据。它相对于Conn方式更加简单直接,对于简单应用场景非常适合。

1、服务端代码示例

  package main

  import (
      "fmt"
      "net"
  )

  func main() {
      // 监听本地的UDP流量
      address, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876")
      if err != nil {
          fmt.Println(err)
      }

      conn, err := net.ListenUDP("udp", address)
      if err != nil {
          fmt.Println(err)
      }

      // 读取数据
      buffer := make([]byte, 1024)
      _, clientAddress, err := conn.ReadFromUDP(buffer)
      if err != nil {
          fmt.Println(err)
      }

      fmt.Printf("Received: %s from %s\n", buffer, clientAddress.String())

      // 发送数据
      _, err = conn.WriteToUDP([]byte("Hello, Client!"), clientAddress)
      if err != nil {
          fmt.Println(err)
      }

      // 关闭连接
      err = conn.Close()
      if err != nil {
          fmt.Println(err)
      }
  }

2、客户端代码示例

  package main

  import (
      "fmt"
      "net"
  )

  func main() {
      // 连接服务器
      serverAddress, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876")
      if err != nil {
          fmt.Println(err)
      }

      conn, err := net.DialUDP("udp", nil, serverAddress)
      if err != nil {
          fmt.Println(err)
      }

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

      // 接收数据
      buffer := make([]byte, 1024)
      _, err = conn.Read(buffer)
      if err != nil {
          fmt.Println(err)
      }

      fmt.Printf("Received: %s\n", buffer)

      // 关闭连接
      err = conn.Close()
      if err != nil {
          fmt.Println(err)
      }
  }

四、Conn方式的使用

Conn方式是以流的形式传输UDP数据。它相对于PacketConn方式更加灵活,可以处理更复杂的业务场景。

1、服务端代码示例

  package main

  import (
      "fmt"
      "net"
  )

  func main() {
      // 监听本地的UDP流量
      address, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876")
      if err != nil {
          fmt.Println(err)
      }

      conn, err := net.ListenUDP("udp", address)
      if err != nil {
          fmt.Println(err)
      }

      for {
          // 读取数据
          buffer := make([]byte, 1024)
          _, clientAddress, err := conn.ReadFromUDP(buffer)
          if err != nil {
              fmt.Println(err)
          }

          fmt.Printf("Received: %s from %s\n", buffer, clientAddress.String())

          // 发送数据
          _, err = conn.WriteToUDP([]byte("Hello, Client!"), clientAddress)
          if err != nil {
              fmt.Println(err)
          }
      }
  }

2、客户端代码示例

  package main

  import (
      "fmt"
      "net"
  )

  func main() {
      // 连接服务器
      serverAddress, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876")
      if err != nil {
          fmt.Println(err)
      }

      conn, err := net.DialUDP("udp", nil, serverAddress)
      if err != nil {
          fmt.Println(err)
      }

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

      // 接收数据
      buffer := make([]byte, 1024)
      _, err = conn.Read(buffer)
      if err != nil {
          fmt.Println(err)
      }

      fmt.Printf("Received: %s\n", buffer)
  }

五、总结

Golang对于UDP协议的支持非常强大,并且使用方便。在实际的项目中,可以根据业务场景选择不同的方式来处理UDP数据。

原创文章,作者:AGWW,如若转载,请注明出处:https://www.506064.com/n/136121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
AGWWAGWW
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相关推荐

  • ENet UDP 用法介绍

    ENet 是用于实现可靠的 UDP 网络通信库。它可以在保证网络可靠性的前提下,提高网络通信的速度,是游戏开发和实时数据传输领域中常用的网络库之一。本文将围绕 ENet UDP 进…

    编程 2025-04-29
  • 使用Golang调用Python

    在现代软件开发中,多种编程语言的协作是相当普遍的。其中一种使用场景是Golang调用Python,这使得在使用Python库的同时,可以利用Golang的高性能和强大并发能力。这篇…

    编程 2025-04-29
  • 使用Golang创建黑色背景图片的方法

    本文将从多个方面介绍使用Golang创建黑色背景图片的方法。 一、安装必要的代码库和工具 在开始创建黑色背景图片之前,我们需要先安装必要的代码库和工具: go get -u git…

    编程 2025-04-29
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论