UE5- socket客户端写法

news2024/11/27 13:41:21

# 实现目标

  • ue5 c++ 实现socket客户端,读取服务端数据,并进行解析

#实现步骤

  1. {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"。

  2. 准备实现自己的webscoket_client。具体操作步骤如下:

    1. 在ue5中自定义类,父类设置为UGameInstance,我这命名为UUWebSocketGameInstance

       

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

      1. 其中init和 Shutdown方法是在父类UGameInstance中定义的,我们这里覆盖它;

      2. WebSocket用来标识我们代码生成的socket,计划在init里初始化,在Shutdown里销毁

      3. OnConnected、OnConnectionError、OnClosed、OnMessage、OnMessageSent用来处理socket消息,具体看后买你的代码实现。

    3. 在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);
      }
      
      
      1. 其中UUWebSocketGameInstance::Init()里初始化了websocket,并配置监听方法

      2. UUWebSocketGameInstance::Shutdown()用来销毁生成的websocket

      3. UUWebSocketGameInstance::OnConnected(),UUWebSocketGameInstance::OnConnectionError,UUWebSocketGameInstance::OnClosed,UUWebSocketGameInstance::OnMessage,UUWebSocketGameInstance::OnMessageSent是用来处理绑定消息的。其中UUWebSocketGameInstance::OnMessage里的消息是json格式,具体格式见下面的备注1.

  3. 开始配置使用并调用方法。

    1. 自主调用可以在某个Character里通过如下代码进行调用。可以在自己的类里面调用。比如放到构造方法或者某个动作触发调用。

      void Amyue521Character::NotifyServer() {
      	UUWebSocketGameInstance* GameInstance = Cast<UUWebSocketGameInstance>(GetGameInstance());
      	if (GameInstance) {
      		if (GameInstance->WebSocket->IsConnected()) {
      			GameInstance->WebSocket->Send("FROM UnrealEngine 5");
      		}
      	}
      }
    2. 通过UE5的项目设置进行修改游戏实例。

       

  4. 备注

    1. 约定接收的json数据格式为

      {
          "Topic": "Unreal",
          "Data": {
              "Key": "mood",
              "Value": 1.0
          }
       }
  5. 总结

    1.  通过该例子我们学到了websocket,json的应用

    2. 还学到的两种打印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);
  6. 待解决的问题

    1. 为什么使用UGameInstance, UGameInstance在UE5中充当什么角色

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

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

相关文章

msvcr110.dll怎么安装?多种方法教你快速修复msvcr110.dll文件

最近很多小伙伴在咨询&#xff0c;msvcr110.dll怎么安装这个问题&#xff0c;其实要安装这个还是比较简单的&#xff0c;而且方法有很多种&#xff0c;每一种方法都有各种的优势&#xff0c;我们只要选择适合我们的一种方法就可以了。好了&#xff0c;下面我们一起来了解一下快…

微信小程序云开发-云存储文件ID转http

一、前言 云开发的云储存文件默认是以cloudID的形式读取的&#xff0c;但是这种读取方式只能在微信小程序或内嵌H5中使用。 所以如果需要在其他地方使用&#xff0c;例如浏览器或网站等其他端读取文件的时候&#xff0c;需要转换成普通的http链接。 目前官方提供有转换的接口…

智慧矿山2.0:煤矿智能化综合管理AI大数据监管平台建设方案设计

一、行业背景 能源与煤矿是我国国民经济的重要物质生产部门和支柱产业之一&#xff0c;同时也是一个安全事故多发的高危行业&#xff0c;施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。煤矿智能化既是未来趋势&#xff0c;更是产业发展需求&#xff0c;建设智慧…

五个技巧,助你有效管理员工信息

对于大多数人力资源部门来说&#xff0c;在时间表、工资单记录和绩效评估之间管理员工信息是一项艰巨的任务。要做到正确管理并不那么容易&#xff0c;尤其是对于员工人数众多的企业而言。 本文提供了有效管理员工信息的关键技巧。无论是小企业主还是人力资源专业人员&#xf…

简单明了的Git入门

一、下载安装git 1、根据连接下载 git-scm.com 一路点击“下一步”&#xff0c;然后取消“view Release Notes” 二、配置git 安装成功后&#xff0c;鼠标右键点击第二个“Git” 配置用户名 git config --global user.name Mihu 配置邮箱&#xff08;注意&#xff1a;这个…

Wiki在企业内部的应用和管理,如何构建有效的Wiki系统?

Wiki 是一个协同著作平台或称开放编辑系统。我们可以用Wiki来建设帮助系统&#xff0c;知识库系统。国内公共wiki最著名就是百度百科&#xff0c;国外则是基维百科&#xff1b;Wiki最著名的例子之一是维基百科&#xff0c;它在MediaWiki上运行&#xff0c;任何拥有Web浏览器的人…

东盟全面覆盖?长城战略部署核心区域市场,首个百万粉丝国产品牌

根据最新消息&#xff0c;长城汽车在东南亚地区取得了巨大的成功&#xff0c;成功进军了亚洲最大的汽车市场之一-印度尼西亚。这标志着长城汽车已经实现了东盟核心市场的全面覆盖&#xff0c;成为全球布局的重要一步。 在过去的几年里&#xff0c;长城汽车在东盟地区的市场布局…

Nacos服务创建与访问测试

1.Nacos概述: Nacos&#xff08;DynamicNaming and Configuration Service&#xff09;是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴&#xff0c;成长于十年双十一的洪峰考验&#xff0c;沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下&a…

30 WEB漏洞-RCE代码及命令执行漏洞全解

目录 前言代码执行命令执行代码执行函数&#xff08;PHP&#xff09;命令执行函数修复方法演示案例墨者靶场黑盒功能点命令执行-应用功能墨者靶场白盒代码及命令执行-代码分析墨者靶场黑盒层RCE漏洞检测-公开漏洞Javaweb-Struts2框架类RCE漏洞-漏洞层面一句话Webshell后门原理代…

Ubuntu20.04下安装搜狗输入法Linux版

Ubuntu20.04下安装搜狗输入法Linux版 参考搜狗输入法的官网安装指南&#xff1b; 第一步&#xff1a;打开搜狗输入法官网&#xff1b; https://shurufa.sogou.com/ 点击X86_64后将会自动跳转到搜狗输入法的安装指南中&#xff1b; 安装指南 Ubuntu搜狗输入法安装指南 搜狗…

Python深度学习入门 - - 人工神经网络学习笔记

文章目录 前言一、神经网络原理1、输入层2、全连接层3、激活函数4、损失函数5、前向传播6、反向传播 二、Python实战神经网络1. 权重初始化技巧2. 梯度问题技巧3. 模型泛化技巧 总结 前言 如果说机器学习是人工智能的皇冠&#xff0c;深度学习就是这顶皇冠上的明珠&#xff0c;…

RHCE——十、防火墙、iptables、firewalld

防火墙 一、什么是防火墙1、分类&#xff1a;2、Netfilter(数据包过滤)2.1 定义2.2 Netfilter分析内容 3、防火墙无法完成的任务4、iptables 与 firewalld 区别 二、iptables1、iptables执行原则1.1 原则1.2 防火墙规则 2、规则链2.1 概念2.2 分析2.3 规则链分类2.4 规则链之间…

购买堡垒机成本有哪些?可以产生哪些收益?

我们大家都知道堡垒机的重要性&#xff0c;因此不少企业都在纷纷准备购买堡垒机。但有小伙伴在问&#xff0c;购买堡垒机成本有哪些&#xff1f;可以产生哪些收益&#xff1f;今天我们就来简单聊聊。 购买堡垒机成本有哪些&#xff1f; 1、购买成本&#xff1a;堡垒机购买成…

数字孪生可视化交互设计编辑平台在企业数字化发展发挥重要作用

数字孪生技术作为一种新兴的信息技术&#xff0c;已经在众多领域取得了显著的成果。然而&#xff0c;要充分发挥数字孪生技术的优势&#xff0c;很多公司都因为数字孪生大屏开发门槛高而无法享受到科技红利&#xff0c;因此数字孪生大屏开发编辑器应运而生。 深圳华锐视点作为专…

Transformer (Attention Is All You Need) 论文精读笔记

Transformer(Attention Is All You Need) Attention Is All You Need 参考&#xff1a;跟李沐学AI-Transformer论文逐段精读【论文精读】 摘要&#xff08;Abstract&#xff09; 首先摘要说明&#xff1a;目前&#xff0c;主流的序列转录&#xff08;序列转录&#xff1a;给…

Ubantu安装mongodb,开启远程访问和认证

最近因为项目原因需要在阿里云服务器上部署MongoDB&#xff0c;操作系统为Ubuntu&#xff0c;网上查阅了一些资料&#xff0c;特此记录一下步骤。 1.运行apt-get install mongodb命令安装MongoDB服务&#xff08;如果提示找不到该package&#xff0c;说明apt-get的资源库版本比…

超详细 | 灰狼优化算法原理及其实现(Matlab)

由于元启发式算法的灵活性&#xff0c;推导自由&#xff0c;简单&#xff0c;许多作者相继提出新的元启发式算法。这些算法正在迅速成为解决复杂优化问题的重要工具。最流行的元启发式算法有以下四种类型&#xff0c; 第一种是进化算法&#xff1a;其中比较有代表性的有遗传算…

3.2.0 终极预告!云原生支持新增 Spark on k8S 支持

视频贡献者 | 王维饶 视频制作者 | 聂同学 编辑整理 | Debra Chen Apache DolphinScheduler 3.2.0 版本将发布&#xff0c;为了让大家提前了解到此版本更新的主要内容&#xff0c;我们已经制作了几期视频和内容做了大致介绍&#xff0c;包括《重磅预告&#xff01;Apache Dol…

Exadata Smart Scan 初体验

找了一台Exadata X8M-2 1/4配&#xff0c;安装了一个单实例的19c数据库。 安装了标准的SSB Schema&#xff0c;事实表lineorder近4亿行&#xff0c;近42GB&#xff1a; NUM_ROWS BLOCKS AVG_ROW_LEN TABLESPACE_NAME ---------- ---------- ----------- -----------------…