在go语言中实现UDP客户端服务器读写实例

2023-06-01 00:00:00 客户端 实例 读写

如何在Go语言中建立一个简单的客户-服务器UDP程序。这个UDP例子改编自之前的Golang中如何创建TCP客户端-服务器例子的教程。

下面是一个Golang中UDP服务器程序的例子。

该服务器将首先设置一个监听器,然后开始监听本地主机上的UDP客户端。

你可以根据你的配置来改变主机名和端口号。

udpserver.go:

package main
 import (
         "fmt"
         "log"
         "net"
 )
 func handleUDPConnection(conn *net.UDPConn) {
         //这里是你想做的事情,比如读或写到客户端
         buffer := make([]byte, 1024)
         n, addr, err := conn.ReadFromUDP(buffer)
         fmt.Println("UDP client : ", addr)
         fmt.Println("从UDP客户端收到的信息 :  ", string(buffer[:n]))
         if err != nil {
                 log.Fatal(err)
         }
         // 注意:需要在WriteToUDP()函数中指定客户端地址。
         // 否则,你将得到这个错误信息
         //写udp:写:如果你使用Write()函数而不是WriteToUDP(),则需要目的地地址
         //将信息写回给客户
         message := []byte("Hello UDP client!")
         _, err = conn.WriteToUDP(message, addr)
         if err != nil {
                 log.Println(err)
         }
 }
 func main() {
         hostName := "localhost"
         portNum := "6000"
         service := hostName + ":" + portNum
         udpAddr, err := net.ResolveUDPAddr("udp4", service)
         if err != nil {
                 log.Fatal(err)
         }
         //为传入的UDP连接设置监听器
         ln, err := net.ListenUDP("udp", udpAddr)
         if err != nil {
                 log.Fatal(err)
         }
         fmt.Println("UDP服务器启动并在6000端口监听")
         defer ln.Close()
         for {
                 //等待UDP客户端的连接
                 handleUDPConnection(ln)
         }
 }

建立这个udpserver.go并在后台运行它。

./udpserver &


然后在另一台机器上运行客户端(如果可能的话)并连接到服务器上

udpclient.go:

 package main
 import (
         "log"
         "net"
         "fmt"
 )
 func main() {
         hostName := "localhost"
         portNum := "6000"
         service := hostName + ":" + portNum
         RemoteAddr, err := net.ResolveUDPAddr("udp", service)
         //LocalAddr := nil
         // see https://golang.org/pkg/net/#DialUDP
         conn, err := net.DialUDP("udp", nil, RemoteAddr)
         // 注意:你也可以使用 net.ResolveUDPAddr 来处理 LocalAddr。
         // 为了简化本教程,我们将只使用nil。
         if err != nil {
                 log.Fatal(err)
         }
         log.Printf("已建立连接到 %s \n", service)
         log.Printf("远程UDP地址 : %s \n", conn.RemoteAddr().String())
         log.Printf("本地UDP客户端地址 : %s \n", conn.LocalAddr().String())
         defer conn.Close()
         //写信给服务器
         message := []byte("Hello UDP server!")
         _, err = conn.Write(message)
         if err != nil {
                 log.Println(err)
         }
         //接收来自服务器的信息
         buffer := make([]byte, 1024)
         n, addr, err := conn.ReadFromUDP(buffer)
         fmt.Println("UDP服务器 : ", addr)
         fmt.Println("从UDP服务器收到 : ", string(buffer[:n]))
 }


udpserver.go的输出样本:

UDP服务器已启动并在6000端口监听
UDP 客户端:127.0.0.1:63937
从UDP客户端收到的信息:Hello UDP server!

udpclient.go的输出样本:

2022/12/26 11:14:56 已建立连接到localhost:6000
2022/12/26 11:14:56 远程UDP地址 : 127.0.0.1:6000
2022/12/26 11:14:56 本地UDP客户端地址 : 127.0.0.1:63937
UDP服务器 : 127.0.0.1:6000
从UDP服务器收到 : Hello UDP client!

相关文章