UE Websocket笔记

参考链接

[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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

思伟老友记 | 晋江市尚亿建材实业有限公司携手思伟软件16年

晋江市尚亿建材实业有限公司 晋江市尚亿建材实业有限公司成立于2006年&#xff0c;建有两个混凝土搅拌站&#xff0c;是晋江市成立时间最长的搅拌站之一。目前拥有25部搅拌车&#xff0c;5部泵送车&#xff0c;3部装载机&#xff0c;混凝土年产量超过50万m。 思伟软件与尚亿公…

土壤水分测量仪QY-800S多层一体化监测土壤墒情

产品概述&#xff1a; 土壤水分测量仪又名非接触式土壤水分测量仪、土壤墒情测量仪&#xff0c;是一款以介电常数检测原理为基础的传感器。能够针对不同土层的土壤水分含量进行动态观测&#xff0c;而且是进行快速、准确、全面地观测&#xff0c;让人们实现对土壤的高度感知。 …

freeswitch编译mod_av支持webrtc MCU通话

系统环境 一、FS相关网站 二、第三方库安装 1.apt安装 2.指定版本sofia-sip安装 3.指定版本spandsp安装 4.指定版本libks安装 5.指定版本openssl安装 三、指定版本FS安装 1.CPPFLAGS配置 2.编译器版本 3.FS配置编译 四、FS&#xff0c;fs_cli运行&#xff0c;模块加载 附录 1.安…

软考2018下午第六题改编逻辑(状态模式)

在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…

官方版小白重装系统之制作装机U盘篇

一、前言 很多人会安装电脑的操作系统&#xff0c;也有很多人不会安装&#xff0c;甚至还要花时间花金钱找人安装。 网上重装系统的网站很多&#xff0c;安装系统的工具软件也很多&#xff0c;其中不乏捆绑有病毒木马、广告间谍的&#xff0c;很多人深受其害&#xff0c;那为什…

Navicat Premium 16 for Mac/Windows:高效的数据库开发工具

Navicat Premium 16是一款功能强大的数据库开发工具&#xff0c;为开发人员提供了全面的工具和功能&#xff0c;帮助他们更高效地进行数据库开发和管理。不论是初学者还是专业开发人员&#xff0c;Navicat Premium 16都能满足他们的需求&#xff0c;并提供直观、易用的界面。 …

智汇恒星科技|控乐屋.全宅智能冠军代言来啦, 智慧家居千亿蓝海

随着5G、大数据、云计算、物联网等技术的发展&#xff0c;智能化正覆盖人们生活的方方面面&#xff0c;全屋智能的出现为“一键式”智能家居生活享受提供无限可能。近年来智能家居行业总体规模增长迅速&#xff0c;数据显示&#xff0c;2022年中国智能家居行业市场规模约为6200…

应用架构——集群、分布式、微服务的概念及异同

一、什么是集群&#xff1f; 集群是指将多台服务器集中在一起&#xff0c; 每台服务器都实现相同的业务&#xff0c;做相同的事&#xff1b;但是每台服务器并不是缺 一不可&#xff0c;存在的主要作用是缓解并发能力和单点故障转移问题。 集群主要具有以下特征&#xff1a; …

粤能环保亮相迪拜COP28,智能技术铸就运河城市可持续未来

在全球应对气候变化的重要会议——迪拜COP28大会上&#xff0c;运河城市面临的独特环境挑战引起了广泛关注。随着城市化进程的加快&#xff0c;运河城市在处理固体废物、减少温室气体排放以及维持水资源安全方面面临着严峻考验。智能垃圾分类作为应对这些挑战的有效途径&#x…

基于SSM框架的仓库管理系统

基于SSM框架的仓库管理系统 文章目录 基于SSM框架的仓库管理系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 现代商业环境中&#xff0c;仓库管理对于企业的运营效率和客户满意度至关重要。传统的手工管理方式已经无法满足日益复杂的仓储需求。…

应用APP开发程序编辑中的数据加密和解密以及签名使用解释技巧

我们知道在现代互联网应用中&#xff0c;数据的安全性至关重要。加密、解密和签名算法是保护用户隐私和数据完整性的基石。本文将为您介绍一些程序员必须知道的加密、解密和签名算法&#xff0c;帮助您在应用开发中确保数据的安全性。 图片来源&#xff1a;应用APP开发程序编辑…

C语言入门课程之课后习题之折半查找法

目录 1解题思路&#xff1a; 2代码所示&#xff1a; 3运行代码&#xff1a; 4习题不难&#xff0c;多刷题&#xff0c;练思路&#xff0c;最重要的不是学会了一道题&#xff0c;而是掌握其编程思想&#xff1b; 1解题思路&#xff1a; 折半查找法&#xff08;half-interval…

2024年强烈推荐mac 读写NTFS工具Tuxera NTFS for Mac2023中文破解版

大家好啊&#xff5e;今天要给大家推荐的是 Tuxera NTFS for Mac2023中文破解版&#xff01; 小可爱们肯定知道&#xff0c;Mac系统一直以来都有一个小小的痛点&#xff0c;就是无法直接读写NTFS格式的移动硬盘和U盘。但是&#xff0c;有了Tuxera NTFS for Mac2023&#xff0c;…

Kubeadm构建K8S集群指南:从环境准备到Dashboard部署的详细步骤与常见问题解决方案

文章目录 一、环境准备1、准备1主2从2、设置主机名与时区3、添加hosts网络主机配置4、关闭防火墙5、验证是否配置正确 二、安装Kubeadm1、在每个Centos上安装Docker2、确保从cgroups均在同一个从groupfs3、安装kubeadm集群部署工具4、关闭交换区5、配置网桥6、通过镜像安装k8s7…

亚信安慧AntDB数据库中级培训ACP上线,中国移动总部首批客户认证通过

近日&#xff0c;亚信安慧AntDB数据库ACP&#xff08;AntDB Certified Professional&#xff09;中级培训课程于官网上线。在中国移动总部客户运维团队、现场项目部伙伴和AntDB数据库成员的协同组织下&#xff0c;首批中级认证学员顺利完成相关课程的培训&#xff0c;并获得Ant…

LAMP安装部署网站

目录 什么是LAMP? 实验&#xff08;搭建一个论坛&#xff09; 一&#xff0c;安装apache 1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件…

【LeetCode:1466. 重新规划路线 | DFS + 图 + 树】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

区块链如何影响数字营销的各个方面?

在过去的几年里&#xff0c;由于区块链等新技术和趋势的进步&#xff0c;数字营销领域发生了各种变化和发展。区块链是加密货币爱好者和投资者当前的流行语。然而&#xff0c;它的可能性已经超出了加密货币的世界&#xff0c;今天&#xff0c;来自不同行业的组织正在获得他们的…

Python接口自动化测试:断言封装详解

概要 在进行API接口测试时&#xff0c;断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中&#xff0c;我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中&#xff0c;我们主要会使用两个库&#xff1a;requests和jsonpath。…

人脸检测,人脸识别综述

Retinaface SCRFD [PDF] CenterFace: Joint Face Detection and Alignment Using Face as Point | Semantic Scholar