Golang 学习 - UDP通信

  • UDP 服务端

    // 1. 组织一个 UDP 地址结构,指定服务器的 IP + port
    svcAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8003")
    if err != nil {
    	fmt.Println("ResolveUDPAddr err:", err)
    	return
    }
    
    fmt.Println("udp 服务器地址结构,创建完成。")
    
    // 2. 创建用于通信的 sokcet ,绑定地址结构
    udpConn, err := net.ListenUDP("udp", svcAddr)
    if err != nil {
    	fmt.Println("ListenUDP err:", err)
    	return
    }
    // 3. 结束后关闭
    defer udpConn.Close()
    
    fmt.Println("udp 服务器通信 socket,创建完成。")
    
    // 4. 读取客户端发送的数据
    buf := make([]byte, 4096)
    for  {
    	// ---- 主 go 程读取客户端发送的数据 ----
    	// n :读取到的字节数
    	// cltAddr :客户端的地址
    	// err :error
    	n, cltAddr, err := udpConn.ReadFromUDP(buf)
    	if err != nil {
    		fmt.Println("ReadFromUDP err:", err)
    		return
    	}
    
    	// 模拟处理数据
    	fmt.Printf("服务器读到 %v 的数据 :%s\n", cltAddr, string(buf[:n]))
    
    	// ---- 每有一个客户端连接上来,启动一个 go 程写数据
    	go func() {
    		// 回写数据给客户端
    		daytime := time.Now().String() + "\n"
    
    		_, err = udpConn.WriteToUDP([]byte(daytime), cltAddr)
    		if err != nil {
    			fmt.Println("WriteToUDP err:", err)
    			return
    		}
    	}()
    }
    
  • UDP 客户端

    // 1. 指定服务器 IP + port ,创建通信套接字(socket)
    conn, err := net.Dial("udp", "127.0.0.1:8003")
    if err != nil {
    	fmt.Println("net.Dial err:", err)
    	return
    }
    // 2. 结束后关闭
    defer conn.Close()
    
    // 3. 主动写数据给服务器
    conn.Write([]byte("Are you Ready?"))
    
    buf := make([]byte, 4096)
    // 4. 接收服务器返回的数据
    n, err := conn.Read(buf)
    if err != nil {
    	fmt.Println("conn.Read err:", err)
    	return
    }
    // 5. 处理收到的服务器返回数据
    fmt.Println("服务器回发:", string(buf[:n]))
    

你可能感兴趣的:(Golang)