UDP客户端实现示例

package main

import (
   "fmt"
   "net"
   "time"
)

func main() {
   // UDP服务器的地址和端口(重要提醒:启动UDP服务器时要使用192.168.*.*,不能使用127.0.0.1)
   var address = "192.168.*.*:9292"

   var err error

   // 解析UDP服务器地址
   var udpAddr *net.UDPAddr
   udpAddr, err = net.ResolveUDPAddr("udp4", address)
   if err != nil {
      fmt.Println("解析UDP服务器地址失败:" + err.Error())
      return
   }

   // 连接UDP服务器
   var udpConn *net.UDPConn
   udpConn, err = net.DialUDP("udp", nil, udpAddr)
   if err != nil {
      fmt.Println("连接UDP服务器失败:" + err.Error())
      return
   }

   // 断开连接
   defer func(udpConn *net.UDPConn) {
      err = udpConn.Close()
      if err != nil {
         fmt.Println("断开连接失败:" + err.Error())
      }
   }(udpConn)

   // 发送数据到UDP服务器
   _, err = udpConn.Write([]byte("PHP是世界上最好的语言"))
   if err != nil {
      fmt.Println("发送数据到UDP服务器失败:" + err.Error())
      return
   }

   // 接收UDP服务器响应数据
   go func() {
      var buffer = make([]byte, 1024)
      var bytes int // 响应数据字节数(一个汉字占3个字节)
      var addr *net.UDPAddr

      for {
         bytes, addr, err = udpConn.ReadFromUDP(buffer) // 重要提醒:这里会发生阻塞,直到收到响应数据
         if err != nil {
            fmt.Println("接收UDP服务器响应数据失败:" + err.Error())
            return
         }
         fmt.Printf("收到UDP服务器(%s)的数据(%d字节):%s\n", addr.String(), bytes, buffer[:bytes])
      }
   }()

   // 休眠一段时间,让UDP服务器有充足时间返回数据
   time.Sleep(time.Second * 10)
}

Copyright © 2024 码农人生. All Rights Reserved