UE Websocket笔记

news2025/1/21 0:58:49

参考链接

[UE4 C++入门到进阶]12.Websocket网络通信 - 哔哩哔哩 包含怎么用Nodejs 写测试服务器

UE4_使用WebSocket和Json(上) - 知乎 包含Python写测试服务器

UE4_使用WebSocket和Json(下) - 知乎

示例代码

xxx.Build.cs

 "WebSockets"
.h

#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include "IWebSocket.h"
#include "PTNetworkSubsystem.generated.h"


/**
 * 
 */
UCLASS()
class PIECETOGETHERTOOLS_API UPTNetworkSubsystem : public UWorldSubsystem
{
	GENERATED_BODY()

	virtual void Initialize(FSubsystemCollectionBase& Collection) override;

	virtual void Deinitialize() override;


	/// <summary>
	/// 连接成功
	/// </summary>
	UFUNCTION()
	void OnConnectedCallback();

	/// <summary>
	/// 连接错误
	/// </summary>
	/// <param name="Error"></param>
	UFUNCTION()
	void OnConnectionErrorCallback(const FString& Error);

	/// <summary>
	/// 接收数据
	/// </summary>
	/// <param name="Message"></param>
	UFUNCTION()
	void OnReceivedMessageCallback(const FString& Message);

	/// <summary>
	/// 关闭回调
	/// </summary>
	/// <param name="Code"></param>
	/// <param name="Reason"></param>
	/// <param name="bWasClean"></param>
	UFUNCTION()
	void OnClosedCallback(int32 Code, const FString& Reason, bool bWasClean);

	/// <summary>
	/// 连接服务器
	/// </summary>
	/// <param name="URL"></param>
	UFUNCTION(BlueprintCallable, Category = "Vince|Network")
	void ConnectToServer(const FString URL);

	/// <summary>
	/// 发送信息
	/// </summary>
	/// <param name="Message"></param>
	UFUNCTION(BlueprintCallable, Category = "Vince|Network")
	void SendMessage(const FString Message);

	/// <summary>
	/// 手动关闭
	/// </summary>
	UFUNCTION(BlueprintCallable, Category = "Vince|Network")
	void Disconnect();

	TSharedPtr<class IWebSocket>Socket;
	
};
.cpp


#include "PTNetworkSubsystem.h"
#include "WebSockets/Public/WebSocketsModule.h"
//#include "AsyncHttpObject.h"

void UPTNetworkSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
	Super::Initialize(Collection);

	if (!FModuleManager::Get().IsModuleLoaded("WebSockets"))
	{
		FModuleManager::Get().LoadModule("WebSockets");
	}
	
}


void UPTNetworkSubsystem::Deinitialize()
{
	Disconnect();

	Super::Deinitialize();
}


void UPTNetworkSubsystem::OnConnectedCallback()
{
	UE_LOG(LogTemp, Warning, TEXT("连接成功"));
}

void UPTNetworkSubsystem::OnConnectionErrorCallback(const FString& Error)
{
	UE_LOG(LogTemp, Warning, TEXT("连接错误,Error:%s"), *Error);
}

void UPTNetworkSubsystem::OnReceivedMessageCallback(const FString& Message)
{
	UE_LOG(LogTemp, Warning, TEXT("收到消息,Message:%s"), *Message);

	/*
	示例
	{
		"Topic": "Unreal",
			"List" : {
			"Key": "mood",
				"Value" : 1.0
		}
	}*/

	TSharedPtr<FJsonObject> RootObj = MakeShareable(new FJsonObject());
	TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(Message);

	if (FJsonSerializer::Deserialize(JsonReader, RootObj)) // 通过JsonReader读取RootObj
	{
		FString Topic = RootObj->GetStringField("Topic"); // Topic
		UE_LOG(LogTemp, Warning, TEXT("%s Topic:%s"), *FString(__FUNCTION__), *Topic);

		TSharedPtr<FJsonObject> ListObj = MakeShareable(new FJsonObject());
		ListObj = RootObj->GetObjectField("List"); // List 

		FString Key = ListObj->GetStringField("Key"); // Key
		UE_LOG(LogTemp, Warning, TEXT("%s Key:%s"), *FString(__FUNCTION__), *Key);

		float Value = ListObj->GetNumberField("Value"); // Value
		GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Cyan, FString::Printf(TEXT("Value %d"), Value), true);

	}

}

void UPTNetworkSubsystem::OnClosedCallback(int32 Code, const FString& Reason, bool bWasClean)
{
	UE_LOG(LogTemp, Warning, TEXT("连接关闭,Code:%d,reason:%s"), Code, *Reason);
}

void UPTNetworkSubsystem::ConnectToServer(const FString URL)
{
	//创建Websocket对象
	Socket = FWebSocketsModule::Get().CreateWebSocket(URL);

	// Bind Events
	// Socket->OnConnectionError().AddLambda([](const FString& Error)->
	//         void{UE_LOG(LogTemp,Warning,TEXT("%s"),*Error)}); // Lambda绑定方式


	//绑定连接成功回调
	Socket->OnConnected().AddUObject(this, &UPTNetworkSubsystem::OnConnectedCallback);

	//绑定连接失败回调
	Socket->OnConnectionError().AddUObject(this, &UPTNetworkSubsystem::OnConnectionErrorCallback);

	//绑定连接关闭回调
	Socket->OnClosed().AddUObject(this, &UPTNetworkSubsystem::OnClosedCallback);

	//绑定收到消息回调
	Socket->OnMessage().AddUObject(this, &UPTNetworkSubsystem::OnReceivedMessageCallback);

	Socket->Connect();

	//UAsyncHttpObject::AsyncHttpDownload("https://t7.baidu.com/it/u=2621658848,3952322712&fm=193&f=GIF", FPaths::ProjectContentDir() + "Paks", "4");
}

void UPTNetworkSubsystem::SendMessage(const FString Message)
{
	if (Socket.IsValid())
	{
		Socket->Send(Message);

	}
}

void UPTNetworkSubsystem::Disconnect()
{
	if (Socket.IsValid())
	{
		UE_LOG(LogTemp, Warning, TEXT("手动关闭"));
		Socket->Close(1000, "手动关闭");

		
	}
}

Websoket 地址前缀只能是ws/wss/wss+insecure

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

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

相关文章

万界星空科技MES---制造企业的加工生产模式

在现代制造业中&#xff0c;加工生产模式是制造企业组织和管理生产过程的重要方面。不同的加工模式适用于不同的生产需求和产品类型。其中流水型、离散型和混合型是三种常见的加工生产模式。1. 流水型加工模式 流水型加工模式是一种高度自动化的生产方式&#xff0c;适用于…

Django-Redis

NoSQL&#xff1a;(不支持sql语句) Redis MongoDB Hbase hadoop Cassandra hadoop key-value数据库&#xff08;非关系性数据库&#xff09; redis优势 性能高&#xff0c;读取速度快&#xff0c;存在内存中 Redis应用场景 用来做缓存 在某些特定场景下替代传统数据库---社交…

WEB组态编辑器(BY组态)介绍

BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架的限制。同时由于BY组态只是一个插件&#xff0c;不能独立运行&#xff0c;必须嵌入到你方软件平台…

每日一题:LeetCode-11.盛水最多的容器

每日一题系列&#xff08;day 13&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

JAVA导出PDF(一)

思路一&#xff1a;直接导出pdf 使用freemarker和itext把html转pdf&#xff0c;存在中文乱码&#xff0c;宋体不识别&#xff0c;需下载simsun.ttc字体&#xff0c;空白占位符不识别等等问题&#xff0c;对前端依赖性较大&#xff0c;不推荐&#xff1b; 适用范围&#xff1a;…

【目标检测从零开始】torch搭建yolov3模型

用torch从0简单实现一个的yolov3模型&#xff0c;主要分为Backbone、Neck、Head三部分 目录 Backbone&#xff1a;DarkNet53结构简介代码实现Step1&#xff1a;导入相关库Step2&#xff1a;搭建基本的Conv-BN-LeakyReLUStep3&#xff1a;组成残差连接块Step4&#xff1a;搭建Da…

idea本地调试hadoop 遇到的几个问题

1.DEA对MapReduce的toString调用报错&#xff1a;Method threw ‘java.lang.IllegalStateException‘ exception. Cannot evaluate org.apache.hadoop.mapreduc 解决方法&#xff1a;关闭 IDEA 中的启用“ tostring() ”对象视图 2.代码和hdfs路径都对的情况下&#xff0c;程序…

如何使用ArcGIS Pro制作类似CAD的尺寸注记

经常使用CAD制图的朋友应该比较熟悉CAD内的尺寸标注&#xff0c;这样的标注看起来直观且简洁&#xff0c;那么在ArcGIS Pro内能不能制作这样尺寸注记呢&#xff0c;答案是肯定的&#xff0c;这里为大家介绍一下制作的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所…

(JAVA)OpenCV的安装与使用

本安装教程属于CLI安装&#xff0c;Windows用户可以使用Power Shell 官网教程点击查看 安装OpenCV # git克隆项目 git clone git://github.com/opencv/opencv.git cd opencv # 切换对应的版本分支 git checkout 4.x mkdir build && cd build # 生成Makefile cmake -D…

tomcat配置管理员And配置访问静态资源

配置管理员 打开 tomcat\conf\tomcat-users.xml <tomcat-users xmlns"http://tomcat.apache.org/xml"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://tomcat.apache.org/xml tomcat-users.xsd"version&qu…

UE Http笔记

c参考链接 UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客 虚幻引擎:UEC如何对JSON文件进行读写?-CSDN博客 UE4 HTTP使用 官方免费插件 VaRest 在代码插件创建的VaRest - 虚幻引擎商城 UE5在蓝图中使用Varest插件Get&#xff0c;Post两种常见请求方式…

No Chromedriver found that can automate Chrome ‘x.x.xxxx‘的解决办法

一、前置说明 在使用Appium对Android设备自动化测试时&#xff0c;切换WebView时抛出异常&#xff1a; selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver foun…

第54天:django学习(三)

页面上的增删改查 创建一个django项目&#xff08;使用django3版本&#xff09;day54——dj&#xff0c;并创建应用app01 在models.py文件中创建表 class UserInfo(models.Model):username models.CharField(max_length32)password models.CharField(max_length32)gender m…

删除PPT文件的备注内容

解决方案的工作经常汇报以及经常做ppt的回报工作&#xff0c;但是删除备注很痛苦。 在网上或者拿历史的ppt文件修改后&#xff0c;需要删除ppt备注内容以及删除ppt个人文件信息的办法&#xff1a; 现象&#xff1a;很多备注信息&#xff0c;需要删除 解决办法一、 文件--信息-…

Django + Matplotlib:实现数据分析显示与下载为PDF或SVG

写作背景 首先&#xff0c;数据分析在当前的信息时代中扮演着重要的角色。随着数据量的增加和复杂性的提高&#xff0c;人们对于数据分析的需求也越来越高。 其次&#xff0c;笔者也确确实实曾经接到过一个这样的开发需求&#xff0c;甲方是一个医疗方面的科研团队&#xff0…

最新版本——Hadoop3.3.6单机版完全部署指南

大家好&#xff0c;我是独孤风&#xff0c;大数据流动的作者。 本文基于最新的 Hadoop 3.3.6 的版本编写&#xff0c;带大家通过单机版充分了解 Apache Hadoop 的使用。本文更强调实践&#xff0c;实践是大数据学习的重要环节&#xff0c;也能在实践中对该技术有更深的理解&…

Excel 表列序号

题目链接 Excel 表列序号 题目描述 注意点 columnTitle 仅由大写英文组成1 < columnTitle.length < 7 解答思路 对于"CAB"&#xff0c;计算其序列号的思路&#xff1a;字母B的贡献值为2&#xff0c;字母A的贡献值为1 * 26&#xff0c;字母C的贡献值为3 * …

销售如何用企微SCRM加速潜客孵化,提升转化率?

营销推广与销售转化相互协同是势不可挡的趋势 直播带货、抖音房云店等玩法的兴起&#xff0c;是当前社交网络将营销与销售场景合二为一的缩影。因此企业在业务上&#xff0c;也要让营销推广与销售转化相互协同。以客户成交为中心&#xff0c;不局限于单项目获客、服务、转化的…

浅谈基于泛在电力物联网的综合能源管控平台设计及硬件选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;城区内一般都具有错综复杂的能源系统&#xff0c;且大部分能耗都集中于城区的各企、事业单位中。基于泛在电力物联网的综合能源管控平台将城区内从能源产生到能源消耗的整体流动情况采用大屏清晰展示&#xff…

Linux-进程之间的通信

目录 ​编辑 一.什么是进程之间的通信 二.进程之间的通信所访问的数据 三.进程之间的通信是如何做到的 四.基于内存文件级别的通信方式——管道 1.什么是管道 2.管道的建立过程——匿名管道 a.什么是匿名管道 b.匿名管道特点&#xff1a; c.使用匿名管道的…