UE5- c++ websocket客户端写法
# 实现目标
- ue5 c++ 实现socket客户端,读取服务端数据,并进行解析
#实现步骤
- {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息,最终输出如下:
using UnrealBuildTool;public class myue521 : ModuleRules {public myue521(ReadOnlyTargetRules Target) : base(Target){PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "EnhancedInput", "WebSockets","JsonUtilities", "Json"});} }说明,其中myue521是我的模块名,文件名为myue521.Build.cs。 新增的模块:"WebSockets","JsonUtilities", "Json"。
-
准备实现自己的webscoket_client。具体操作步骤如下:
-
在ue5中自定义类,父类设置为UGameInstance,我这命名为UUWebSocketGameInstance

-
在UUWebSocketGameInstance.h里新增如下方法。

-
其中init和 Shutdown方法是在父类UGameInstance中定义的,我们这里覆盖它;
-
WebSocket用来标识我们代码生成的socket,计划在init里初始化,在Shutdown里销毁
-
OnConnected、OnConnectionError、OnClosed、OnMessage、OnMessageSent用来处理socket消息,具体看后买你的代码实现。
-
-
在UUWebSocketGameInstance.cpp里实现已经生命的方法。
// Fill out your copyright notice in the Description page of Project Settings.#include "UWebSocketGameInstance.h" #include "WebSockets/Public/WebSocketsModule.h" #include "WebSockets/Public/IWebSocket.h" #include "Templates/SharedPointer.h"void UUWebSocketGameInstance::Init() {Super::Init();if (!FModuleManager::Get().IsModuleLoaded("WebSockets")) {FModuleManager::Get().LoadModule("WebSockets");}WebSocket = FWebSocketsModule::Get().CreateWebSocket("ws://127.0.0.1:8081/webSocketServer/ue");WebSocket->OnConnected().AddUObject(this, &UUWebSocketGameInstance::OnConnected);WebSocket->OnConnectionError().AddUObject(this, &UUWebSocketGameInstance::OnConnectionError);WebSocket->OnClosed().AddUObject(this, &UUWebSocketGameInstance::OnClosed);WebSocket->OnMessage().AddUObject(this, &UUWebSocketGameInstance::OnMessage);WebSocket->OnMessageSent().AddUObject(this, &UUWebSocketGameInstance::OnMessageSent);WebSocket->Connect();}void UUWebSocketGameInstance::Shutdown() {if (WebSocket->IsConnected()) {WebSocket->Close();} Super::Shutdown(); }void UUWebSocketGameInstance::OnConnected() {UE_LOG(LogTemp, Warning, TEXT("%s"), *FString(__FUNCTION__));GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Green, "Successfully Connected"); }void UUWebSocketGameInstance::OnConnectionError(const FString& Error) {UE_LOG(LogTemp, Warning, TEXT("%s Error:%s"), *FString(__FUNCTION__), *Error); }void UUWebSocketGameInstance::OnClosed(int32 StatusCode, const FString& Reason, bool bWasClean) {UE_LOG(LogTemp, Warning, TEXT("%s StatusCode:%d Reason:%s bWasClean:%d"),*FString(__FUNCTION__), StatusCode, *Reason, bWasClean); }void UUWebSocketGameInstance::OnMessage(const FString& Message) {GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, FString::Printf(TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message) );UE_LOG(LogTemp, Warning, TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message);TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(Message);TSharedPtr<FJsonObject> Root;if (FJsonSerializer::Deserialize(Reader, Root)){if (Root->HasField(TEXT("Topic"))) {FString Topic = Root->GetStringField(TEXT("Topic"));TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Data = Root->GetObjectField(TEXT("Data"));// TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));FString KeyField = Data->GetStringField("Key");FString ValueField = Data->GetStringField("Value");GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, "Key: " + KeyField + ",Value:" + ValueField);}else {GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, "解析json异常");}} }void UUWebSocketGameInstance::OnMessageSent(const FString& MessageString) {UE_LOG(LogTemp, Warning, TEXT("%s MessageString:%s"), *FString(__FUNCTION__), *MessageString); }-
其中UUWebSocketGameInstance::Init()里初始化了websocket,并配置监听方法
-
UUWebSocketGameInstance::Shutdown()用来销毁生成的websocket
-
UUWebSocketGameInstance::OnConnected(),UUWebSocketGameInstance::OnConnectionError,UUWebSocketGameInstance::OnClosed,UUWebSocketGameInstance::OnMessage,UUWebSocketGameInstance::OnMessageSent是用来处理绑定消息的。其中UUWebSocketGameInstance::OnMessage里的消息是json格式,具体格式见下面的备注1.
-
-
-
开始配置使用并调用方法。
-
自主调用可以在某个Character里通过如下代码进行调用。可以在自己的类里面调用。比如放到构造方法或者某个动作触发调用。
void Amyue521Character::NotifyServer() {UUWebSocketGameInstance* GameInstance = Cast<UUWebSocketGameInstance>(GetGameInstance());if (GameInstance) {if (GameInstance->WebSocket->IsConnected()) {GameInstance->WebSocket->Send("FROM UnrealEngine 5");}} } -
通过UE5的项目设置进行修改游戏实例。

-
-
备注
-
约定接收的json数据格式为
{"Topic": "Unreal","Data": {"Key": "mood","Value": 1.0}}
-
-
总结
-
通过该例子我们学到了websocket,json的应用
-
还学到的两种打印log的方法
GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, FString::Printf(TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message) );UE_LOG(LogTemp, Warning, TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message);
-
-
待解决的问题
-
为什么使用UGameInstance, UGameInstance在UE5中充当什么角色
-
ULog 的使用,参考文档:http://www.bimant.com/blog/ue_log-crash-course/
-
相关文章:
UE5- c++ websocket客户端写法
# 实现目标 ue5 c 实现socket客户端,读取服务端数据,并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息,最终输出如下: using UnrealBuildTool;…...
C语言——函数的使用
无参无返回值 语法格式如下: // 函数定义 void 函数名() {函数体 }// 函数调用 函数名();函数名是标识符的一种,需要遵循规则函数只需要定义一次,反复调用只定义函数, 不调用函数, 函数永远不会被执行案例需求: 编写一个函数&am…...
DVWA XSS
反射型 low 查看源代码,没有任何过滤 构造 medium 这里是过滤了 high 这里把双写和大小写和JavaScript都过滤了,用事件来绕过<img src0 οnerrοralert(“xss”)> impossible 这里使用htmlspecialchars进行实体转换并且输出的结果还不能使用事件来…...
石油化工智慧安监方案:TSINGSEE青犀视频AI智能识别安全生产风险预警平台建设
一、行业背景 石油化工生产存储企业属于高温、高压、易燃、易爆、有毒的危险行业,其生产装置大型化、密集化、生产工艺复杂、生产过程紧密耦合。随着互联网技术的发展,运用先进的AI、物联网、大数据、云计算等技术手段不断提高石油化工行业的安全监管水…...
R语言图形绘制
(1)条形图 > barplot(c(1,2,4,2,6,4,3,5)) > barplot(c(1,2,4,2,6,4,3,5),horiz TRUE) #besideTRUE 表示将多个组别的图形并排显示,使它们在水平方向上对齐 #而当 besideFALSE(默认值)时,多个组别的…...
2023第七届蓝帽杯 初赛 web LovePHP
LovePHP 直接给了源码。 network查看到,PHP版本是7.4.33 题目要求我们GET一个my_secret.flag参数,根据PHP字符串解析特性,PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事: 删…...
Pytorch 的基本概念和使用场景介绍
文章目录 一、基本概念1. 张量(Tensor)2. 自动微分(Autograd)3. 计算图(Computation Graph)4. 动态计算图(Dynamic Computation Graph)5. 变量(Variable) 二、…...
git 基础入门
Git基础入门 Git是一个分布式 版本管理系统,用于跟踪文件的变化和协同开发。 版本管理:理解成档案馆,记录开发阶段各个版本 分布式&集中式 分布式每个人都有一个档案馆,集中式只有一个档案馆。分布式每人可以管理自己的档案…...
openssl 生成自签名证书
1、openssl生成CA根证书 1.1、生成CA私钥 openssl genrsa -out root_ca.key 2048 注意:私钥必须妥善保管,既不能丢失,也不能泄露。如果发生丢失和泄露,必须马上重新 生成,以使旧的证书失效。 1.2、通过ca私钥生成pem格…...
微服务dubbo和nexus
微服务是一种软件开发架构风格,它将一个应用程序拆分成一组小型、独立的服务,每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制(通常是 HTTP/REST 或消息队列)相互通信。微服务架构追求高内聚、低耦合&am…...
uView1.0的Upload组件上传图片
<template><u-uploadref"uUpload":file-list"fileList"accept"image/jpeg,image/png" //允许选择图片文件:sizeType"sizeType":max-size"2 * 1024 * 1024" //限制上传的图片文件最大为 2Moversize"over…...
【LeetCode题目详解】第九章 动态规划part03 343. 整数拆分 96.不同的二叉搜索树 (day41补)
本文章代码以c为例! 一、力扣第343题:整数拆分 题目: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输…...
半导体制造常用软件工具总结
半导体制造常用软件工具总结 CIM:Computer Integrated Manufacturing 设备自动化,总称MES:Manufacturing Execution System 制造执行系统EAP:Equipment Automation Programming 设备自动化,是MES与设备的桥梁APC&…...
基于Python的IOS自动化测试环境搭建
文章目录 一、测试架构介绍1.1 WebDriverAgent原理分析1.2 tidevice原理分析二、环境安装2.1 iOS 设备安装 WebDriverAgent2.2 安装iTunes2.3 安装tidevice2.4 安装facebook-wda自动化三、操作流程四、Weditor的安装和使用一、测试架构介绍 以下为测试架构原理图 手机端的WDA…...
技术领导力实战笔记25
25|用心做好“鼓励式”管理 激发正能量 授权 分工作: 老人干新事,新人干老事,强者干难事,弱者干细事 新人干老事 所谓新人,是对业务产品不了解,对工作流程不清晰的岗位新人。对于新人来说&…...
设计模式-职责链+反射
文章目录 前言简单版本的职责链加反射职责链反射思路过程总结 前言 最近学习设计模式对于职责链的学习有了一些深入的了解故此有了这篇博客 简单版本的职责链加反射 职责链模式(Chain of Responsibility Pattern)和反射(Reflection&#x…...
Middleware ❀ Kafka功能与使用详解
文章目录 1. 概述1.1. 消息队列1.2. 应用场景1.3. 工作模式1.4. 基础结构1.4.1. 结构组件1.4.2. 数据同步1.4.3. ACK机制1.4.4. 分区机制1.4.4.1. 使用Partition Key写入1.4.4.2. 轮询写入 - 默认规则1.4.4.3. 指定Partition写入 1.4.5. Offset偏移量1.4.5.1. 消息顺序性1.4.5.…...
python3.11教程1:python基础语法、程序控制、函数
文章目录 一、Python简介1.1 为什么学习python1.2 python安装与配置1.3 python解释器1.4 命令行参数1.4.1 sys.argv变量1.4.2 -c和-m选项 1.5 解释器的运行环境1.5.1 编码格式1.5.2 编码声明 二、Python基础语法2.1 行结构2.2 变量(标识符)2.3 字节串2.4…...
【C++】关于using namepace xxx 使用命名空间和冲突
官方定义 namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。 基本使用 编译及执行命令: g test.cpp -o test ./…...
Linux常用命令——cupsenable命令
在线Linux命令查询工具 cupsenable 启动指定的打印机 补充说明 cupsenable命令用于启动指定的打印机。 语法 cupsenable(选项)(参数)选项 -E:当连接到服务器时强制使用加密; -U:指定连接服务器时使用的用户名; -uÿ…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
