Тип net.UDPConn

Тип net.UDPConn реализует интерфейс net.Conn и предоставляет методы для работы с UDP-соединениями. UDP является протоколом без установления соединения, поэтому UDPConn позволяет отправлять и получать датаграммы от различных адресов. Основные методы типа: ReadFrom для чтения данных с получением адреса отправителя, WriteTo для отправки данных указанному адресату, а также Close для закрытия соединения.

Получение объекта UDPConn

Объект net.UDPConn создается с помощью функций net.DialUDP для установки клиентского соединения или net.ListenUDP для создания серверного слушателя. Также его можно получить через функции net.Dial или net.ListenPacket с указанием сети "udp".

Параметры функций: первый параметр указывает тип сети ("udp", "udp4", "udp6"), второй - локальный адрес для прослушивания или адрес удаленного узла.

Синтаксис

goconn, err := net.DialUDP("udp", nil, remoteAddr)
conn, err := net.ListenUDP("udp", localAddr)

Пример

Пример отправки UDP-датаграммы на удаленный сервер с использованием DialUDP:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  remoteAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println("Error resolving address:", err)
    return
  }

  conn, err := net.DialUDP("udp", nil, remoteAddr)
  if err != nil {
    fmt.Println("Error dialing UDP:", err)
    return
  }
  defer conn.Close()

  message := []byte("Hello, UDP server!")
  _, err = conn.Write(message)
  if err != nil {
    fmt.Println("Error writing data:", err)
    return
  }

  fmt.Println("Data sent successfully")
}

Результат выполнения кода:

go"Data sent successfully"

Пример

Пример чтения данных с использованием ListenUDP и метода ReadFrom для получения адреса отправителя:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println("Error resolving address:", err)
    return
  }

  conn, err := net.ListenUDP("udp", localAddr)
  if err != nil {
    fmt.Println("Error listening UDP:", err)
    return
  }
  defer conn.Close()

  buffer := make([]byte, 1024)
  n, addr, err := conn.ReadFrom(buffer)
  if err != nil {
    fmt.Println("Error reading data:", err)
    return
  }

  fmt.Printf("Received %d bytes from %s: %s\n", n, addr, string(buffer[:n]))
}

Результат выполнения кода:

go"Received 17 bytes from 127.0.0.1:54321: Hello, UDP server!"

Пример

Пример отправки ответа клиенту с использованием метода WriteTo, который позволяет указать адрес назначения:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println("Error resolving address:", err)
    return
  }

  conn, err := net.ListenUDP("udp", localAddr)
  if err != nil {
    fmt.Println("Error listening UDP:", err)
    return
  }
  defer conn.Close()

  buffer := make([]byte, 1024)
  n, clientAddr, err := conn.ReadFrom(buffer)
  if err != nil {
    fmt.Println("Error reading data:", err)
    return
  }

  response := []byte("Echo: " + string(buffer[:n]))
  _, err = conn.WriteTo(response, clientAddr)
  if err != nil {
    fmt.Println("Error writing response:", err)
    return
  }

  fmt.Println("Response sent to client")
}

Результат выполнения кода:

go"Response sent to client"

Смотрите также

  • тип net.TCPConn,
    представляющий TCP-соединение
  • тип net.UDPAddr,
    представляющий адрес UDP-узла
  • функцию net.Dial,
    для установления соединения с указанным адресом
  • функцию net.ListenPacket,
    для создания слушателя пакетных протоколов