【Go】详解UDP编程

目录

1、UDP协议

2、UDP服务端

3、UDP客户端

4、结果展示


1、UDP协议

UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的、不可靠的传输层协议。它与TCP一样是互联网协议套件(TCP/IP)中的核心协议之一,用于在计算机网络中传输数据。

UDP的特点和工作原理如下:

  1. 面向无连接:UDP不需要在数据传输之前建立连接,发送方直接将数据打包成数据报并发送给接收方。因此,UDP的连接设置和释放过程简单,通信开销较小。

  2. 不可靠性:相对于TCP的可靠传输,UDP提供的是一种尽力而为的传输方式。它不保证数据报的可靠性传输,因此数据报可能会丢失、重复、乱序。如果接收方在传输过程中发现数据报错误或者丢失,则无法进行自动重传。

  3. 高效性:由于UDP不需要建立连接和维护状态信息,因此它的数据传输效率高。同时,UDP的头部开销比较小,每个数据报只需要8字节的固定长度的头部。

  4. 支持广播和多播:UDP对于广播(将数据包发送给同一网络中的所有设备)和多播(将数据包发送给特定组内的所有设备)有良好的支持。

  5. 适用场景:UDP通常适用于对数据传输实时性要求较高的应用,如流媒体、实时音视频传输、在线游戏等。它可以快速地将数据传输到接收方,适用于那些对传输可靠性要求不高、重要性较低的数据。

总结起来,UDP是一种简单、高效的传输协议,不提供可靠性传输和连接机制,适用于一些对实时性要求较高、传输可靠性要求相对较低的应用场景。

2、UDP服务端

使用Go语言的net包实现的UDP服务端代码如下:

package main

import (
	"fmt"
	"net"
)

// UDP server端
func main() {
	listen, err := net.ListenUDP("udp", &net.UDPAddr{
		IP:   net.IPv4(0, 0, 0, 0),
		Port: 30000,
	})
	if err != nil {
		fmt.Println("listen failed, err:", err)
		return
	}
	defer listen.Close()
	for {
		var data [1024]byte
		n, addr, err := listen.ReadFromUDP(data[:]) // 接收数据
		if err != nil {
			fmt.Println("read udp failed, err:", err)
			continue
		}
		fmt.Printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)
		_, err = listen.WriteToUDP(data[:n], addr) // 发送数据
		if err != nil {
			fmt.Println("write to udp failed, err:", err)
			continue
		}
	}
}

3、UDP客户端

使用Go语言的net包实现的UDP客户端代码如下:

package main

import (
	"fmt"
	"net"
)

// UDP 客户端
func main() {
	socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
		IP:   net.IPv4(0, 0, 0, 0),
		Port: 30000,
	})
	if err != nil {
		fmt.Println("连接服务端失败,err:", err)
		return
	}
	defer socket.Close()
	sendData := []byte("Hello server")
	_, err = socket.Write(sendData) // 发送数据
	if err != nil {
		fmt.Println("发送数据失败,err:", err)
		return
	}
	data := make([]byte, 4096)
	n, remoteAddr, err := socket.ReadFromUDP(data) // 接收数据
	if err != nil {
		fmt.Println("接收数据失败,err:", err)
		return
	}
	fmt.Printf("recv:%v addr:%v count:%v\n", string(data[:n]), remoteAddr, n)
}

4、结果展示

猜你喜欢

转载自blog.csdn.net/fanjufei123456/article/details/132019077