46、Go语言基础 - 网络编程 - UDP 服务端与客户端

作者: 温新

分类: 【Go基础】

阅读: 286

时间: 2023-12-05 00:39:01

hi,我是温新

UDP协议

UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。

UDP 服务端

package main

import (
	"fmt"
	"net"
)

func main() {
	// 解析UDP地址,将"127.0.0.1:20001"解析为UDP地址
	listen, err := net.ResolveUDPAddr("udp", "127.0.0.1:20001")
	if err != nil {
		fmt.Println("监听失败:", err)
		return
	}

	// 创建UDP连接并绑定到解析后的UDP地址
	conn, err := net.ListenUDP("udp", listen)
	if err != nil {
		fmt.Println("建立连接失败:", err)
		return
	}

	defer conn.Close() // 在函数结束时关闭连接
	fmt.Println("UDP服务开启,监听20001端口")

	buffer := make([]byte, 1024)
	for {
		n, addr, err := conn.ReadFromUDP(buffer) // 从客户端读取数据
		if err != nil {
			fmt.Println("读取客户端数据失败:", err)
			return
		}
		receivedData := string(buffer[:n])
		fmt.Printf("来自客户端的数据 %s:%s\n", addr, receivedData)

		// 向客户端发送响应数据
		_, err = conn.WriteToUDP([]byte("服务端回复:"+receivedData), addr)
		if err is not nil {
			fmt.Println("响应客户端数据发送失败:", err)
		}
	}
}

这个示例演示了一个简单的UDP服务器端,它可以接收来自客户端的消息并回复。

以下是代码解释:

  • 服务器端通过net.ResolveUDPAddr解析UDP地址,将"127.0.0.1:20001"解析为UDP地址。
  • 服务器端创建UDP连接并绑定到解析后的UDP地址,然后监听在20001端口。
  • 使用defer确保在函数结束时关闭UDP连接,以防止资源泄漏。
  • 服务器端进入无限循环,接收来自客户端的UDP数据。
  • 每次接收数据后,服务器端打印接收到的数据以及来自客户端的地址。
  • 然后,服务器端发送带有"服务端回复:"前缀的响应数据给客户端,以表示收到消息并回复。
  • 错误处理用于捕获任何可能的错误情况,例如UDP连接建立失败或数据读取失败。

UDP 客户端

package main

import (
	"fmt"
	"net"
)

func main() {
	// 创建UDP连接,连接到"127.0.0.1:20001"的UDP服务端
	conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
		IP:   net.IPv4(127, 0, 0, 1), // 服务器的IP地址
		Port: 20001,                // 服务器的端口号
	})
	if err != nil {
		fmt.Println("连接 UDP 服务端失败:", err)
		return
	}
	defer conn.Close() // 在函数结束时关闭UDP连接

	message := "hello, go udp message" // 待发送的消息
	_, err = conn.Write([]byte(message)) // 向服务器发送消息
	if err != nil {
		fmt.Println("客户端发送数据失败:", err)
		return
	}

	buffer := make([]byte, 1024) // 用于接收服务器的响应
	n, _, err := conn.ReadFromUDP(buffer) // 从服务器接收响应数据
	if err != nil {
		fmt.Println("响应失败:", err)
		return
	}
	serverResponse := string(buffer[:n]) // 将接收的数据转换为字符串
	fmt.Println("UDP 服务端数据:", serverResponse) // 打印服务器的响应数据
}

这个示例演示了一个简单的UDP客户端,它连接到服务器并发送一条消息,然后接收和打印来自服务器的响应。

以下是代码解释:

  • 客户端通过net.DialUDP创建UDP连接,连接到UDP服务端的地址"127.0.0.1:20001"。
  • 如果连接失败,将打印错误信息并退出程序。
  • 使用defer语句确保在函数结束时关闭UDP连接,以防止资源泄漏。
  • 客户端准备待发送的消息"hello, go udp message"。
  • 使用conn.Write向服务器发送消息。
  • 客户端创建一个缓冲区buffer,用于接收服务器的响应。
  • 通过conn.ReadFromUDP从服务器接收响应数据。
  • 最后,客户端将接收到的服务器响应数据打印出来。
请登录后再评论