目录
1、UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的、不可靠的传输层协议。它与TCP一样是互联网协议套件(TCP/IP)中的核心协议之一,用于在计算机网络中传输数据。
UDP的特点和工作原理如下:
面向无连接:UDP不需要在数据传输之前建立连接,发送方直接将数据打包成数据报并发送给接收方。因此,UDP的连接设置和释放过程简单,通信开销较小。
不可靠性:相对于TCP的可靠传输,UDP提供的是一种尽力而为的传输方式。它不保证数据报的可靠性传输,因此数据报可能会丢失、重复、乱序。如果接收方在传输过程中发现数据报错误或者丢失,则无法进行自动重传。
高效性:由于UDP不需要建立连接和维护状态信息,因此它的数据传输效率高。同时,UDP的头部开销比较小,每个数据报只需要8字节的固定长度的头部。
支持广播和多播:UDP对于广播(将数据包发送给同一网络中的所有设备)和多播(将数据包发送给特定组内的所有设备)有良好的支持。
适用场景: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)
}