目 录CONTENT

文章目录

Go网络编程-UDP编程

Sakura
2023-12-17 / 0 评论 / 0 点赞 / 52 阅读 / 4061 字 / 正在检测是否收录...

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 ) 流程

  1. 解析 UDP 地址

  2. 监听 UDP

  3. 读内容

  4. 写内容

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 ) 流程

  1. 建立连接

  2. 写操作

  3. 读操作

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 连接

3.

0

评论区