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/zh-hant/n/136121.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AGWW的頭像AGWW
上一篇 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

發表回復

登錄後才能評論