UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。
UDP服务端
package main
import (
"fmt"
"net"
"strings"
)
// UDP server端
func main() {
conn, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 40000,
})
if err != nil {
fmt.Println("listen UDP failed, err:", err)
return
}
defer conn.Close()
// 不需要建立连接,直接收发数据
var data [1024]byte
for {
n, addr, err := conn.ReadFromUDP(data[:])
if err != nil {
fmt.Println("read from UDP failed, err:", err)
return
}
fmt.Println(data[:n])
reply := strings.ToUpper(string(data[:n]))
// 发送数据
conn.WriteTo([]byte(reply), addr)
}
}
UDP客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
// UDP 客户端
func main() {
socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 40000,
})
if err != nil {
fmt.Println("连接服务端失败,err:", err)
return
}
reader := bufio.NewReader(os.Stdin)
var reply [1024]byte
for {
fmt.Printf("请输入内容:")
msg, _ := reader.ReadString('\n')
socket.Write([]byte(msg))
// 接收回复的数据
n, addr, err := socket.ReadFromUDP(reply[:])
if err != nil {
fmt.Println("reply msg failed, err:", err)
return
}
fmt.Println("收到", addr, "回复信息:", string(reply[:n]))
}
}