UDP 编程
1. UDP 简单介绍
UDP 是 User Datagram Protocol 的简称,中文名是用户数据协议
UDP 是 一种五连接的不可抗靠的传输协议,( 不需要进行三次握手和四次挥手 )
1. net 包支持的 UDP 函数
// 解析UDPAddr
func ResolveUDPAddr(network, address string) (*UDPAddr, error)
// 监听UDP地址
func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error)
// 连接UDP服务器
func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPConn, error)
// UDP读
func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error)
// UDP写
func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)
UDP 读写操作流程
服务端 ( server ) 流程
解析 UDP 地址
监听 UDP
读内容
写内容
func UDPServer() {
// 1.解析地址
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9999")
if err != nil {
log.Fatalln(err)
}
// 2.监听
udpConn, err := net.ListenUDP("udp", addr)
defer udpConn.Close()
if err != nil {
log.Fatalln(err)
}
// 打印监听的地址
log.Println("UDP服务器监听的地址为:", udpConn.LocalAddr().String())
// 3.读
buf := make([]byte, 1024)
// 返回值分别表示读取的字节数和客户端的地址
n, udpAddr, err := udpConn.ReadFromUDP(buf)
if err != nil {
log.Fatalln(err)
}
log.Printf("received %s from %s \n", string(buf[:n]), udpAddr.String())
// 4.写
data := "Sakura,Server"
wn, err := udpConn.WriteToUDP([]byte(data), udpAddr)
if err != nil {
log.Fatalln(err)
}
log.Printf("send %s(%d) to %s \n", string(data), wn, udpAddr.String())
}
客户端 ( client ) 流程
建立连接
写操作
读操作
func UDPClient() {
// 1. 建立连接
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9999")
if err != nil {
log.Fatalln(err)
}
// 源码注释: If laddr is nil, a local address is automatically chosen.
udpConn, err := net.DialUDP("udp", nil, addr)
// 2. 写
data := "Sakura,Client"
// 因为已经建立好连接了所以不需要指定客户端地址
// 可以直接使用write而非writetoUDP
wn, err := udpConn.Write([]byte(data))
if err != nil {
log.Fatalln(err)
}
if err != nil {
log.Fatalln(err)
}
log.Printf("send %s(%d) to %s \n", string(data), wn, addr.String())
// 3.读
buf := make([]byte, 1024)
// 返回值分别表示读取的字节数和客户端的地址
n, udpAddr, err := udpConn.ReadFromUDP(buf)
if err != nil {
log.Fatalln(err)
}
log.Printf("received %s from %s \n", string(buf[:n]), udpAddr.String())
}
2. 已连接和未连接的 UDP 连接
评论区