目录:
- 一、为何UDP不需要listen:
- 二、服务端:
  - 1.建立套接字
  - 2.对套接字操作
  	  - 循环读取数据
  	  -	回复消息
- 三、客户端:
  - 1.连接服务器
  - 2.写入数据
  - 3.读取消息

一、为何UDP不需要listen
listen()是进入监听状态,表示愿意接收连接请求。
accept()是接受新连接。
listen之后有连接请求就将其放到队列中,accept()时把新连接请求从队列中取出,建立新的socket。

UDP无法保证数据安全是因为只需要收发即可,无需建立连接
而TCP是需要建立连接确保数据的安全性

二、服务端

func main() {
	// 1.开启监听(建立套接字)
	listener, err := net.ListenUDP("udp", &net.UDPAddr{
		IP:   net.IPv4(0, 0, 0, 0),
		Port: 9091,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer listener.Close()
	// 2.循环读取数据
	for {
		var data [1024]byte
		n, client, err := listener.ReadFromUDP(data[:])
		if err != nil {
			log.Println(err)
			break
		}
		fmt.Println(client, string(data[:n]))
		// 3.回复消息
		listener.WriteToUDP([]byte("recevied success!"), client)
	}
}

三、客户端

func main() {
	// 1.连接获取socket套接字
	conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
		IP:   net.IPv4(172, 31, 50, 249),
		Port: 9091,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	// 2.发送消息
	conn.Write([]byte("jstang"))
	// 3.接收消息
	data := make([]byte, 1024)
	conn.ReadFromUDP(data)
	fmt.Println(string(data))
}