【UE5】如何开发安卓项目的udp客户端

在这里插入图片描述

1关于如何打包安卓项目这里就不赘述了
2代码举例。最重要的就是这两句`

#if PLATFORM_ANDROID
#endif#if PLATFORM_WINDOWS
#endif

全部代码如下:
Button_Sheng.h:

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"#include "Components/Button.h"
#include "Components/TextBlock.h"#include "Button_Sheng.generated.h"
#if PLATFORM_ANDROID
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <pthread.h>  
#endif/*** */
UCLASS()
class CCEC_CLIENT_0113_API UButton_Sheng : public UUserWidget
{GENERATED_BODY()public:// 声明按钮和文本块UPROPERTY(meta = (BindWidget))UButton* MyButton;UPROPERTY(meta = (BindWidget))UTextBlock* MyTextBlock;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Custom")int Code;// 移植过来的函数声明UFUNCTION(BlueprintCallable, Category = "aaaaaa")void Sheng(FString Message);
protected:// 构造函数virtual void NativeConstruct() override;public:// 动态创建 Widget 的函数UFUNCTION(BlueprintCallable, Category = "Widget")void CreateDynamicWidget(int32 WidgetID);// 动态创建 Widget 的函数(基于 FString)UFUNCTION(BlueprintCallable, Category = "Widget")void CreateDynamicWidgetByName(const FString& WidgetName);protected:// 父容器,用于存放动态创建的 Widget//UPROPERTY(meta = (BindWidget))//class UPanelWidget* ParentContainer;
};

Button_Sheng.cpp:

#include "Button_Sheng.h"
#include "Components/WidgetComponent.h"
#include <iostream>  #include "Blueprint/WidgetTree.h"
#include "Components/PanelWidget.h"
#include "UObject/ConstructorHelpers.h"#if PLATFORM_ANDROID
#define BROADCAST_PORT 8888  
#define BROADCAST_PORT2 8889  
#define BROADCAST_PORT3 8887 
#define BROADCAST_MESSAGE1 "1" 
#define BROADCAST_MESSAGE2 "2" 
#define BROADCAST_MESSAGE3 "3" 
#define BROADCAST_MESSAGE42 "42"void* send_broadcast13(void* arg) {int sockfd;struct sockaddr_in broadcast_addr;const char* message = static_cast<const char*>(arg);//char* message = (char*)arg;ssize_t bytes_sent;// 创建UDP套接字  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");pthread_exit(NULL);}// 允许广播  int broadcast_enable = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)) < 0) {perror("setsockopt(SO_BROADCAST) failed");close(sockfd);pthread_exit(NULL);}// 设置广播地址  memset(&broadcast_addr, 0, sizeof(broadcast_addr));broadcast_addr.sin_family = AF_INET;broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); // 局域网广播地址  broadcast_addr.sin_port = htons(BROADCAST_PORT);// 发送广播消息  bytes_sent = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));if (bytes_sent < 0) {perror("sendto failed");}else {printf("Broadcast message sent: %s\n", message);}// 关闭套接字  close(sockfd);pthread_exit(NULL);
}
void* send_broadcast14(void* arg) {int sockfd;struct sockaddr_in broadcast_addr;char* message = (char*)arg;ssize_t bytes_sent;// 创建UDP套接字  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");pthread_exit(NULL);}// 允许广播  int broadcast_enable = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)) < 0) {perror("setsockopt(SO_BROADCAST) failed");close(sockfd);pthread_exit(NULL);}// 设置广播地址  memset(&broadcast_addr, 0, sizeof(broadcast_addr));broadcast_addr.sin_family = AF_INET;broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); // 局域网广播地址  broadcast_addr.sin_port = htons(BROADCAST_PORT2);// 发送广播消息  bytes_sent = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));if (bytes_sent < 0) {perror("sendto failed");}else {printf("Broadcast message sent: %s\n", message);}// 关闭套接字  close(sockfd);pthread_exit(NULL);
}void* send_broadcast15(void* arg) {int sockfd;struct sockaddr_in broadcast_addr;char* message = (char*)arg;ssize_t bytes_sent;const char* message1 = "1";const char* message2 = "2";// 创建UDP套接字  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");pthread_exit(NULL);}// 允许广播  int broadcast_enable = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)) < 0) {perror("setsockopt(SO_BROADCAST) failed");close(sockfd);pthread_exit(NULL);}// 设置广播地址  memset(&broadcast_addr, 0, sizeof(broadcast_addr));broadcast_addr.sin_family = AF_INET;broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); // 局域网广播地址  broadcast_addr.sin_port = htons(BROADCAST_PORT2);sleep(6);// 发送广播消息  bytes_sent = sendto(sockfd, message2, strlen(message2), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));sleep(6);// 发送广播消息  bytes_sent = sendto(sockfd, message1, strlen(message1), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));// 关闭套接字  close(sockfd);pthread_exit(NULL);
}
void* send_broadcast16(void* arg) {int sockfd;struct sockaddr_in broadcast_addr;char* message = (char*)arg;ssize_t bytes_sent;// 创建UDP套接字  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");pthread_exit(NULL);}// 允许广播  int broadcast_enable = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)) < 0) {perror("setsockopt(SO_BROADCAST) failed");close(sockfd);pthread_exit(NULL);}// 设置广播地址  memset(&broadcast_addr, 0, sizeof(broadcast_addr));broadcast_addr.sin_family = AF_INET;broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); // 局域网广播地址  broadcast_addr.sin_port = htons(BROADCAST_PORT3);//就在这改!!!!!!!!!!!!// 发送广播消息  bytes_sent = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));if (bytes_sent < 0) {perror("sendto failed");}else {printf("Broadcast message sent: %s\n", message);}// 关闭套接字  close(sockfd);pthread_exit(NULL);
}
#endif#if PLATFORM_ANDROID
void UButton_Sheng::Sheng(FString Message)
{// 为 Message 分配足够的空间,包括 null 终止符int32 Length = Message.Len() + 1;char* MessageCStr = new char[Length];FMemory::Memcpy(MessageCStr, TCHAR_TO_UTF8(*Message), Length);pthread_t thread1, thread2, thread3;// 创建线程来发送第一个广播消息  if (pthread_create(&thread1, NULL, send_broadcast13, (void*)MessageCStr) != 0) {//调用8888的函数,传入1perror("pthread_create for first message failed");exit(EXIT_FAILURE);}// 注意:为每个 pthread_create 调用复制新的字符串或使用其他同步机制来共享同一个字符串// 这里为了简化,我们为每个线程都复制了一个新字符串(这不是最高效的方法,但避免了线程安全问题)char* MessageCStr2 = new char[Length];FMemory::Memcpy(MessageCStr2, TCHAR_TO_UTF8(*Message), Length);// 创建线程来发送第二个广播消息  if (pthread_create(&thread2, NULL, send_broadcast14, (void*)MessageCStr2) != 0) {//调用8889的第一个函数,传入1perror("pthread_create for second message failed");// 注意:这里应该加入代码来取消或等待第一个线程,以避免资源泄露  // 但为了简单起见,我们直接退出程序(在实际应用中,这是不推荐的)  exit(EXIT_FAILURE);}char* MessageCStr3 = new char[Length];FMemory::Memcpy(MessageCStr3, TCHAR_TO_UTF8(*Message), Length);// 创建线程来发送第二个广播消息  if (pthread_create(&thread3, NULL, send_broadcast16, (void*)MessageCStr3) != 0) {//调用8889的第一个函数,传入1perror("pthread_create for second message failed");// 注意:这里应该加入代码来取消或等待第一个线程,以避免资源泄露  // 但为了简单起见,我们直接退出程序(在实际应用中,这是不推荐的)  exit(EXIT_FAILURE);}// 等待两个线程完成  if (pthread_join(thread1, NULL) != 0) {perror("pthread_join for first message failed");}if (pthread_join(thread2, NULL) != 0) {perror("pthread_join for second message failed");}if (pthread_join(thread3, NULL) != 0) {perror("pthread_join for first message failed");}// 释放内存delete[] MessageCStr;delete[] MessageCStr2;delete[] MessageCStr3;
}
#endif#if PLATFORM_WINDOWS
void UButton_Sheng::Sheng(FString Message)
{UE_LOG(LogTemp, Error, TEXT(" %s"), *Message);
}
#endifvoid UButton_Sheng::NativeConstruct()
{
}void UButton_Sheng::CreateDynamicWidget(int32 WidgetID)
{// 根据 WidgetID 拼接资源路径FString WidgetPath = FString::Printf(TEXT("/Game/widget/Widget_%d.Widget_%d_C"), WidgetID, WidgetID);// 加载 Widget ClassTSubclassOf<UUserWidget> WidgetClass = LoadClass<UUserWidget>(nullptr, *WidgetPath);if (WidgetClass){// 创建 Widget 实例UUserWidget* DynamicWidget = CreateWidget<UUserWidget>(GetWorld(), WidgetClass);if (DynamicWidget){DynamicWidget->AddToViewport();UE_LOG(LogTemp, Log, TEXT("Widget %d created and added to container!"), WidgetID);}}else{UE_LOG(LogTemp, Error, TEXT("Failed to load Widget Class for ID: %d"), WidgetID);}
}void UButton_Sheng::CreateDynamicWidgetByName(const FString& WidgetName)
{// 根据 WidgetName 拼接资源路径FString WidgetPath = FString::Printf(TEXT("/Game/UI/%s.%s_C"), *WidgetName, *WidgetName);// 加载 Widget ClassTSubclassOf<UUserWidget> WidgetClass = LoadClass<UUserWidget>(nullptr, *WidgetPath);if (WidgetClass){// 创建 Widget 实例UUserWidget* DynamicWidget = CreateWidget<UUserWidget>(GetWorld(), WidgetClass);if (DynamicWidget ){}}else{UE_LOG(LogTemp, Error, TEXT("Failed to load Widget Class for Name: %s"), *WidgetName);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86205.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年6月21和22日复习和预习(python)

一、作业内容 &#xff08;一&#xff09;知识点回顾 用户输入处理 使用input()函数获取用户输入的字符串&#xff0c;并存储到变量中。 条件判断语句 if-elif-else结构&#xff1a;根据不同条件执行相应代码块&#xff0c;适用于多分支判断。 语音合成技术 导入pyttsx3库实现…

Vue 样式穿透语法大全(涵盖 Vue2、Vue3、Less、Scss 等)

1. 什么是样式穿透&#xff1f; 样式穿透是在使用 Vue 组件时&#xff0c;为了修改子组件或第三方组件的样式而使用的一种特殊语法。当我们使用 scoped 样式时&#xff0c;由于样式被限制在当前组件内&#xff0c;要修改子组件的样式就需要使用样式穿透。 2. 为什么需要样式穿…

Python 属性查找:深入理解__getattribute__与__getattr__

目录 一、__getattribute__方法详解 1.1 基本概念 1.2 示例分析 1.3 注意事项 二、__getattr__方法详解 2.1 基本概念 2.2 示例分析 2.3 注意事项 三、__getattribute__与__getattr__的区别对比 3.1 调用时机 3.2 应用场景 3.3 性能影响 四、属性查找顺序 属性查找…

打表法从原理到实战详解

打表法结合经典案例从原理到实战详解 一、打表法基本信息1.1 打表法定义1.2 打表法适用场景1.3 打表法的优缺点 二、打表法经典案例解析2.1 快速计算斐波那契数列2.1.1 问题描述2.1.2 打表思路2.1.3 Java代码实现2.1.4 复杂度分析 2.2 快速判断质数&#xff08;埃氏筛法结合打表…

(LeetCode 面试经典 150 题 )121. 买卖股票的最佳时机 (遍历)

题目&#xff1a;121. 买卖股票的最佳时机 思路&#xff1a;遍历&#xff0c;维护已遍历过的元素中的最小值&#xff0c;时间复杂度0(n)。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int mnprices[0];int mx0;for(int i1;i&…

(洛谷)P4447 [AHOI2018初中组] 分组

题目描述 小可可的学校信息组总共有 n 个队员&#xff0c;每个人都有一个实力值 ai​。现在&#xff0c;一年一度的编程大赛就要到了&#xff0c;小可可的学校获得了若干个参赛名额&#xff0c;教练决定把学校信息组的 n 个队员分成若干个小组去参加这场比赛。 但是每个队员都…

PLA/PHA生物降解化妆品包装材料的稳定性与货架期契合性研究

更多案例&#xff1a;https://npmatc.niicapm.com/ 在可持续发展理念的推动下&#xff0c;化妆品行业正经历一场绿色变革。环保聚合物在包装领域的应用已成为重要趋势&#xff0c;这不仅源于消费者对生态友好产品的需求&#xff0c;更基于全球塑料污染治理的紧迫性。化妆品包装…

STM32[笔记]--4.嵌入式硬件基础

4.嵌入式硬件基础 4.1认识上官二号开发板 主控芯片:STM32F103C8T6高速晶振:8M低速晶振:32.768kLED:5颗KEY:3个 主控芯片内部的资源如下项目介绍内核Cortex-M3Flsah64K*8bitSRAM20K*8bitGPIO37个GPIO,分别为PA0-PB15,PC13-PC15,PD0-PD1ADC2个12bitADC合计12了通道,外部通…

【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程

【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程 1. 引言2. LLaMA-Factory 数据格式概述2.1 Alpaca 格式2.2 ShareGPT 格式 3. 文本数据准备3.1 Alpaca 格式示例3.2 ShareGPT 格式示例3.3 预训练数据格式 4. 多模态数据准备4.1 图像数据准备4.2 视频数据…

JuiceFS 集群部署详细指南:使用 SeaweedFS 作为数据存储,ETCD 作为元数据存储

1. 概述 本指南将详细介绍如何部署一个 JuiceFS 集群,其中数据存储层采用高性能的分布式对象存储 SeaweedFS,元数据存储层采用强一致性的分布式键值存储 ETCD。这种组合方案旨在为用户提供一个高性能、高可用、易于扩展且数据强一致的分布式文件系统解决方案,特别适用于云原…

【数字后端】- 什么是NDR规则?

NDR是指与工艺库的默认规则&#xff08;DR&#xff09;不同的特殊物理规则&#xff1a; 常见的有&#xff1a; 间距规则&#xff08;spacing&#xff09;&#xff1a;增加信号线与邻近线之间的距离&#xff0c;降低Crosstalk串扰。线宽规则&#xff08;width&#xff09;&…

B2B 商城定制的优势:解锁企业数字化转型新动力

精准适配业务流程&#xff0c;贴合企业运营特色​ 每一家企业都有独特的业务流程、运营模式与管理需求。标准化的 B2B 商城往往难以完全满足企业个性化的业务需求&#xff0c;而定制化商城则能够深入剖析企业业务细节&#xff0c;从采购、销售、库存管理到财务管理等全流程&am…

osg实例绘制

#include <osg/Geometry> #include <osg/Geode> #include <osg/Program> #include <osg/VertexAttribDivisor> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <random> // 创建单个立方体几何体&…

Qt面试题汇总

目录 1. 简单说一下Qt 2. 用过QT中的哪些模块&#xff1f; 3. 说一些你常用的Qt控件&#xff1f; 4. Qt中如何创建一个窗口&#xff1f; 5. 说一下QT中创建控件的方式? 6. 说一下Qt中信号和槽机制是什么&#xff1f; 7. 说一下QT信号与槽机制原理&#xff1f; 8. 如何自…

【stm32】标准库学习——USART串口

目录 一、USART串口 1.串口参数及时序 2.USART简介 3.配置USART基本结构 4.初始化模板 (1) 接收一个数据 (2) 发送一个数据 一、USART串口 1.串口参数及时序 波特率:串口通信的速率起始位:标志一个数据帧的开始&#xff0c;固定为低电平数据位:数据帧的有效载荷&#…

黑马Day01-03集开始

03集 JSX jsx里面可以写 表达式,表达式里面会返回一个值js语法的扩展,需要babel解析才能够在浏览器运行 语法 使用花括号 {} ,在里面进行编写jsx代码04集 高频场景 使用引号传递字符串 使用js变量 函数调用和方法调用 使用js对象.js自带的一些对象或new出来的对象{&quo…

vue 路由学习

params 不能传递对象类型如 [ ]和{ } query传参 总结&#xff1a; query传参既可以通过name 和path 找到路由规则里的组件&#xff0c;所以为了统一避免非必要麻烦 无论是使用query传参还是 params传参 映射路由建议统一使用 name 进阶 props的使用 备注&#xff1a;资料来自…

JDK安装全攻略:开启Java编程大门

目录 一、安装前准备1.1 确认系统类型1.2 检查系统要求1.3 下载 JDK 安装包 二、Windows 系统下 JDK 安装步骤2.1 双击安装包2.2 选择安装目录2.3 完成安装 三、Windows 系统环境变量配置3.1 打开环境变量设置3.2 配置 JAVA_HOME 变量3.3 配置 Path 变量3.4 验证配置 四、Linux…

《P1253 扶苏的问题》

题目描述 给定一个长度为 n 的序列 a&#xff0c;要求支持如下三个操作&#xff1a; 给定区间 [l,r]&#xff0c;将区间内每个数都修改为 x。给定区间 [l,r]&#xff0c;将区间内每个数都加上 x。给定区间 [l,r]&#xff0c;求区间内的最大值。 输入格式 第一行是两个整数&…

09.【C语言学习笔记】指针(一)

目录 1. 内存和地址 1.1 内存 1.2 究竟该如何理解编址 2. 指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解引用操作符&#xff08;*&#xff09; 2.2.1 指针变量 2.2.2 如何拆解指针类型 2.2.3 解引用操作符 * 2.3 指针变量的大小…