当前位置: 首页 > news >正文

unreal engine c++ 创建tcp server, tcp client

TCP客户端

TcpConnect.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Common/UdpSocketReceiver.h"
#include "GameFramework/Actor.h"DECLARE_DELEGATE_TwoParams(FOnServerResponseReceived, const int32&, bool);class FTcpConnect : public FRunnable
{
public:// Sets default values for this actor's propertiesFTcpConnect();virtual ~FTcpConnect(){if (ReceiveThread != nullptr){ReceiveThread->Kill(true);delete ReceiveThread;}}// virtual FSingleThreadRunnable* GetSingleThreadInterface() override// {// 	return this;// }
public:// Called every framevoid ConnectToServer(FString ServerAddress, const int32 ServerPort);void SendMessage(const FString& Message);FOnServerResponseReceived& OnDataReceived(){return OnServerResponseReceived;}virtual bool Init() override;virtual void Stop() override;protected:virtual uint32 Run() override;virtual void Exit() override;private:FSocket* Socket;TSharedPtr<FInternetAddr> RemoteAddr;FIPv4Endpoint LocalEndpoint;TArray<uint8> ReceivedData;FUdpSocketReceiver* UDPReceiver;bool bIsReceiving;FRunnableThread* ReceiveThread;int64 StartMs;FOnServerResponseReceived OnServerResponseReceived;
};

TcpConnect.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "Subsystem/TcpConnect.h"// Sets default values
FTcpConnect::FTcpConnect()
{
}void FTcpConnect::ConnectToServer(FString ServerAddress, const int32 ServerPort)
{// Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);// RemoteAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();bool bValid;RemoteAddr->SetIp(*ServerAddress, bValid);RemoteAddr->SetPort(ServerPort);if (Socket->Connect(*RemoteAddr)){UE_LOG(LogTemp, Display, TEXT("Connected to server"));// bIsReceiving = true;ReceiveThread = FRunnableThread::Create(this, TEXT("ReceiveThread"), 128 * 1024);}else{UE_LOG(LogTemp, Error, TEXT("Failed to connect to server"));}
}void FTcpConnect::SendMessage(const FString& Message)
{if (Socket){const TCHAR* MessageData = *Message;int32 BytesSent = 0;StartMs = FDateTime::Now().ToUnixTimestamp() * 1000.0 + FDateTime::Now().GetMillisecond();UE_LOG(LogTemp, Warning, TEXT(" start ms %d"), StartMs);Socket->Send((uint8*)TCHAR_TO_UTF8(MessageData), FCString::Strlen(MessageData), BytesSent);}
}// FOnServerResponseReceived& FTcpConnect::OnDataReceived()
//
// {
// 	// check(ReceiveThread == nullptr);
// 	return OnServerResponseReceived;
// }bool FTcpConnect::Init()
{if (ReceiveThread && Socket){return true;}return false;
}void FTcpConnect::Stop()
{bIsReceiving = false;if (ReceiveThread){ReceiveThread->WaitForCompletion();// ReceiveThread.re}if (Socket){Socket->Close();Socket = nullptr;// Socket.Reset();}
}uint32 FTcpConnect::Run()
{while (bIsReceiving){uint8 Data[1024];int32 BytesReceived = 0;if (Socket->Recv(Data, sizeof(Data), BytesReceived, ESocketReceiveFlags::None)){if (BytesReceived > 0){FString Message = FString(UTF8_TO_TCHAR((const char*)Data));UE_LOG(LogTemp, Warning, TEXT(" message %s"), *Message)int64 EndMs = FDateTime::Now().ToUnixTimestamp() * 1000.0 + FDateTime::Now().GetMillisecond();UE_LOG(LogTemp, Warning, TEXT(" start ms %d  %d"), EndMs, EndMs- StartMs);auto r = OnServerResponseReceived.ExecuteIfBound(EndMs - StartMs, true);bIsReceiving = false;}}FPlatformProcess::Sleep(0.05f);}return 0;
}void FTcpConnect::Exit()
{// FRunnable::Exit();
}

tcp server

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "HAL/Runnable.h"class FSocket;
class FInternetAddr;/*** */
class MYPROJECT2_API FTcpServer : public FRunnable
{
public:FTcpServer();~FTcpServer();// 初始化服务器virtual bool Init() override;// 开始监听连接bool StartListening(FString IpAddress, int32 Port);// 停止监听连接void StopListening();// FRunnable 接口virtual uint32 Run() override;virtual void Stop() override;void HandleTextMessage(const FString& Message);private:// 处理客户端连接void HandleConnection(FSocket* NewClientSocket, const TSharedRef<FInternetAddr>& ClientAddress);FString StringFromBinaryArray(const TArray<uint8>& BinaryArray);class FSocket* serverSocket;FSocket* ListenSocket;FRunnableThread* ServerThread;FThreadSafeBool bIsStopping;TMap<FSocket*, FString> ClientDataMap; // 用于存储每个客户端的数据};

cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "Net/TcpServer.h"#include "Common/TcpSocketBuilder.h"
#include "Interfaces/IPv4/IPv4Endpoint.h"FTcpServer::FTcpServer() : ListenSocket(nullptr), ServerThread(nullptr), bIsStopping(false)
{ServerThread = FRunnableThread::Create(this, TEXT("TcpServerThread"));
}FTcpServer::~FTcpServer()
{StopListening();
}bool FTcpServer::Init()
{// 初始化网络模块// if (!ISocketSubsystem::Init())// {// 	UE_LOG(LogTemp, Error, TEXT("Failed to initialize socket subsystem."));// 	return false;// }return true;
}bool FTcpServer::StartListening(FString IpAddress, int32 Port)
{FString ServerIP = IpAddress;FIPv4Address ServerAddr;if (!FIPv4Address::Parse(ServerIP, ServerAddr)){UE_LOG(LogTemp, Error, TEXT("Server Ip %s is illegal"), *ServerIP);}ListenSocket = FTcpSocketBuilder(TEXT("Socket Listener")).AsReusable().AsBlocking().BoundToAddress(ServerAddr).BoundToPort(Port).Listening(8).WithReceiveBufferSize(1024).WithSendBufferSize(1024);if (ListenSocket){UE_LOG(LogTemp, Warning, TEXT("Server Create Success!"), *ServerIP);// SocketCreateDelegate.Broadcast(true);// GetWorld()->GetTimerManager().SetTimer(ConnectCheckHandler, this, &ATCPServer::ConnectCheck, 1, true);return false;}else{UE_LOG(LogTemp, Error, TEXT("Server Create Failed!"));// SocketCreateDelegate.Broadcast(false);}return false;
}void FTcpServer::StopListening()
{if (ListenSocket){ListenSocket->Close();ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(ListenSocket);ListenSocket = nullptr;}if (ServerThread){ServerThread->WaitForCompletion();delete ServerThread;ServerThread = nullptr;}
}uint32 FTcpServer::Run()
{ISocketSubsystem* SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);if (!SocketSubsystem){UE_LOG(LogTemp, Error, TEXT("Socket subsystem not available."));return 1;}while (!bIsStopping){if (!ListenSocket) continue;TSharedRef<FInternetAddr> ClientAddress = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();FSocket* NewClientSocket = ListenSocket->Accept(*ClientAddress, TEXT("MyTcpServer Connection"));UE_LOG(LogTemp, Log, TEXT("Run"));if (NewClientSocket){// 新客户端连接处理HandleConnection(NewClientSocket, ClientAddress);}FPlatformProcess::Sleep(0.01);}return 0;
}void FTcpServer::Stop()
{UE_LOG(LogTemp, Warning, TEXT("St opped"));bIsStopping = true;
}void FTcpServer::HandleTextMessage(const FString& Message)
{UE_LOG(LogTemp, Warning, TEXT("Received message: %s"), *Message);
}void FTcpServer::HandleConnection(FSocket* NewClientSocket, const TSharedRef<FInternetAddr>& ClientAddress)
{// 在这里处理新客户端连接的逻辑UE_LOG(LogTemp, Warning, TEXT("Client connected: %s"), *ClientAddress->ToString(true));// 接收和处理消息while (NewClientSocket && !bIsStopping){TArray<uint8> ReceivedData;uint32 Size;// 接收数据while (NewClientSocket->HasPendingData(Size)){ReceivedData.Init(0, FMath::Min(Size, 65507u));int32 Read = 0;NewClientSocket->Recv(ReceivedData.GetData(), ReceivedData.Num(), Read);// 处理接收到的数据(这里假设消息以'\n'分隔)FString ReceivedString = StringFromBinaryArray(ReceivedData);TArray<FString> Messages;ReceivedString.ParseIntoArray(Messages, TEXT("\n"), true);for (const FString& Message : Messages){// 处理文本消息HandleTextMessage(Message);}}// 睡眠一段时间,以避免空循环造成CPU过度使用FPlatformProcess::Sleep(0.01);}// 断开客户端连接// UE_LOG(LogTemp, Warning, TEXT("Client disconnected: %s"), *ClientAddress->ToString(true));// NewClientSocket->Close();// ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(NewClientSocket);}FString FTcpServer::StringFromBinaryArray(const TArray<uint8>& BinaryArray)
{return FString(ANSI_TO_TCHAR(reinterpret_cast<const char*>(BinaryArray.GetData())));
}

FTcpServerReceive

h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "HAL/Runnable.h"/*** */
class MYPROJECT2_API FTcpServerReceive: public FRunnable
{
public:FTcpServerReceive(FSocket* InSocket);~FTcpServerReceive();
protected:virtual bool Init() override;virtual void Stop() override;FString StringFromBinaryArray(TArray<uint8> Array);void HandleTextMessage(const FString& String);virtual uint32 Run() override;
private:FSocket* ClientSocket;FRunnableThread* ServerReceiveThread;bool bIsStopping;
};

cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "Net/FTcpServerReceive.h"#include "Sockets.h"
#include "SocketSubsystem.h"FTcpServerReceive::FTcpServerReceive(FSocket* InSocket)
{ClientSocket = InSocket;ServerReceiveThread = FRunnableThread::Create(this, TEXT("ServerReceiveThread"));bIsStopping = false;
}FTcpServerReceive::~FTcpServerReceive()
{if (ClientSocket){ClientSocket->Close();ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(ClientSocket);ClientSocket = nullptr;}if (ServerReceiveThread){ServerReceiveThread->WaitForCompletion();delete ServerReceiveThread;ServerReceiveThread = nullptr;}
}bool FTcpServerReceive::Init()
{if (ServerReceiveThread && ClientSocket){UE_LOG(LogTemp, Warning, TEXT("  %s start"), *FString(__FUNCTION__));return true;}return false;
}void FTcpServerReceive::Stop()
{bIsStopping = true;
}FString FTcpServerReceive::StringFromBinaryArray(TArray<uint8> BinaryArray)
{return FString(ANSI_TO_TCHAR(reinterpret_cast<const char*>(BinaryArray.GetData())));
}void FTcpServerReceive::HandleTextMessage(const FString& Message)
{UE_LOG(LogTemp, Warning, TEXT("Received message: %s"), *Message);
}uint32 FTcpServerReceive::Run()
{while (ClientSocket){TArray<uint8> ReceivedData;uint32 Size;// 接收数据while (ClientSocket->HasPendingData(Size)){ReceivedData.Init(0, FMath::Min(Size, 65507u));int32 Read = 0;ClientSocket->Recv(ReceivedData.GetData(), ReceivedData.Num(), Read);// 处理接收到的数据(这里假设消息以'\n'分隔)FString ReceivedString = StringFromBinaryArray(ReceivedData);TArray<FString> Messages;ReceivedString.ParseIntoArray(Messages, TEXT("\n"), true);for (const FString& Message : Messages){// 处理文本消息HandleTextMessage(Message);}}// 睡眠一段时间,以避免空循环造成CPU过度使用FPlatformProcess::Sleep(0.05);}return 0;
}

使用

GameInstance 使用


void UMyGameInstance::HandleTextMessage(const FString& Message)
{UE_LOG(LogTemp, Warning, TEXT("Received message: %s"), *Message);
}bool UMyGameInstance::Connected(FSocket* Socket, const FIPv4Endpoint& FiPv4Endpoint)
{UE_LOG(LogTemp, Warning, TEXT("Connected %s"), *FiPv4Endpoint.ToString());FTcpServerReceive* ServerReceive = new FTcpServerReceive(Socket);return true;
}void UMyGameInstance::Init()
{Super::Init();FIPv4Address ServerAddr;FIPv4Address::Parse("0.0.0.0", ServerAddr);FIPv4Endpoint IPv4;IPv4.Address = ServerAddr;IPv4.Port = 6666;#if UE_SERVER/FTcpListener* TcpServer = new FTcpListener(IPv4);TcpServer->OnConnectionAccepted().BindUObject(this, &UMyGameInstance::Connected);#elseFTcpClient* TcpClient = new FTcpClient();TcpClient->ConnectToServer("192.168.1.6", 6666);FTimerHandle h;FTimerDelegate d = FTimerDelegate::CreateLambda([=](){FString sent = "aaaaaa";TcpClient->SendMessage(sent);});// GetWorld()->GetTimerManager().SetTimer(h, d, 1.0f, true, 3.0f);#endif
}FString UMyGameInstance::StringFromBinaryArray(const TArray<uint8>& BinaryArray)
{return FString(ANSI_TO_TCHAR(reinterpret_cast<const char*>(BinaryArray.GetData())));
}TSharedPtr<TArray<uint8>, ESPMode::ThreadSafe> UMyGameInstance::StringToByteArray(FString DataString)
{TArray<uint8> DataArray;FTCHARToUTF8 Converter(*DataString);DataArray.Append(reinterpret_cast<const uint8*>(Converter.Get()), Converter.Length());return MakeShared<TArray<uint8>, ESPMode::ThreadSafe>(MoveTemp(DataArray));
}

相关文章:

unreal engine c++ 创建tcp server, tcp client

TCP客户端 TcpConnect.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Common/UdpSocketReceiver.h" #include "GameFramework/Actor.h"DECLARE_DELEGATE…...

24届华东理工大学近5年自动化考研院校分析

今天给大家带来的是华东理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、华东理工大学 学校简介 华东理工大学原名华东化工学院&#xff0c;1956年被定为全国首批招收研究生的学校之一&#xff0c;1960年起被中共中央确定为教育部直属的全国重点大学&#…...

初识集合和背后的数据结构

目录 集合 Java集合框架 数据结构 算法 集合 集合&#xff0c;是用来存放数据的容器。其主要表现为将多个元素置于一个单元中&#xff0c;用于对这些元素进行增删查改。例如&#xff0c;一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合&#xff09;。 Java中有很多种集…...

选择适合你的数据可视化工具:提升洞察力的关键决策

导言&#xff1a; 在当今数据驱动的世界中&#xff0c;数据可视化工具成为了帮助我们理解和传达数据见解的关键工具之一。数据可视化不仅能够将复杂的数据转化为易于理解的可视化形式&#xff0c;还能帮助我们发现数据中的模式、趋势和关联。然而&#xff0c;随着市场上可视化工…...

H5中的draggable

基本语法及事件 draggable 属性规定元素是否可拖动。必须设置&#xff0c;否则没有拖拽效果及事件触发 提示&#xff1a; 链接和图像默认是可拖动的。 提示&#xff1a; draggable 属性经常用于拖放操作 语法 <element draggable"true|false|auto"> 值描…...

搭建SVN服务器

简介 SVN&#xff08;Subversion&#xff09;是一种版本控制工具&#xff0c;用于管理和跟踪文件的修改历史。它可以帮助团队协作开发&#xff0c;方便地共享和更新代码&#xff0c;同时也可以提供备份和安全控制功能。 使用SVN&#xff0c;你可以创建中央代码库&#xff08;…...

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 链接: https://pan.baidu.com/s/1PZ6w5NcSOuKusBTNa3Ng2g?pwd79wr 提取码: 79wr 模板匹配文件 …...

Detector定位算法在FPGA中的实现——section1 原理推导

关于算法在FPGA中的实现,本次利用业余的时间推出一个系列章节,专门记录从算法的推导、Matlab的实现、FPGA的移植开发与仿真做一次完整的FPGA算法开发,在此做一下相关的记录和总结,做到温故知新。 这里以Detector在Global Coordinate System(原点为O)中运动为背景,Detect…...

心电信号去噪:方法与应用

目录 1 去噪技术的发展历程 2 滤波器去噪的应用 3 小波去噪的优势 4 深度学习去噪的前景...

睡眠助手/白噪音/助眠夜曲微信小程序源码下载 附教程

睡眠助手/白噪音/助眠夜曲微信小程序源码 附教程 支持分享海报 支持暗黑模式 包含了音频数据 最近很火的助眠小程序&#xff0c;前端vue&#xff0c;可以打包H5&#xff0c;APP&#xff0c;小程序 后台可以设置流量主广告&#xff0c;非常不错的源码 代码完整 完美运营 搭配无…...

Spring Cloud常见问题处理和代码分析

目录 1. 问题&#xff1a;如何在 Spring Cloud 中实现服务注册和发现&#xff1f;2. 问题&#xff1a;如何在 Spring Cloud 中实现分布式配置&#xff1f;3. 问题&#xff1a;如何在 Spring Cloud 中实现服务间的调用&#xff1f;4. 问题&#xff1a;如何在 Spring Cloud 中实现…...

debian怎么修改man help为中文,wsl怎么修改显示语言为中文

在Debian 12系统中&#xff0c;要将系统语言和Man帮助手册设置为中文&#xff0c;需要执行以下步骤&#xff1a; 安装中文语言包&#xff1a; 首先&#xff0c;更新软件包列表并安装中文语言包。打开终端并运行以下命令&#xff1a; sudo apt update sudo apt install locales配…...

k8s概念-亲和力与反亲和力

回到目录 亲和力 Affinity 对部署调度时的优先选择 分为 节点亲和力 pod亲和力 pod反亲和力 节点亲和力 NodeAffinity 进行 pod 调度时&#xff0c;优先调度到符合条件的亲和力节点上 可配置 硬亲和力和软亲和力 RequiredDuringSchedulingIgnoredDuringExecution 硬…...

【数据结构】实现单链表的增删查

目录 1.定义接口2.无头单链表实现接口2.1 头插addFirst2.2 尾插add2.3 删除元素remove2.4 修改元素set2.5 获取元素get 3.带头单链表实现接口3.1 头插addFirst3.2 尾插add3.3 删除元素remove3.4 判断是否包含元素element 1.定义接口 public interface SeqList<E>{//默认…...

Vue2 第二十节 vue-router (四)

1.全局前置路由和后置路由 2.独享路由守卫 3.组件内路由守卫 4.路由器的两种工作模式 路由 作用&#xff1a;对路由进行权限控制 分类&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫 一.全局前置路由和后置路由 ① 前置路由守卫&#xff1a;每次路由…...

第三章 图论 No.1单源最短路及其综合应用

文章目录 1129. 热浪1128. 信使1127. 香甜的黄油1126. 最小花费920. 最优乘车903. 昂贵的聘礼1135. 新年好340. 通信线路342. 道路与航线341. 最优贸易 做乘法的最短路时&#xff0c;若权值>0&#xff0c;只能用spfa来做&#xff0c;相等于加法中的负权边 1129. 热浪 1129.…...

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件 cmd或者终端用nvm 安装提示&#xff1a; npm不是内部或外部命令,也不是可运行的程序或批处理文件 原因&#xff08;一&#xff09; 提示这个问题&#xff0c;有可能是Node没有安装&#xff0c;也有可能是没有配置…...

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序&#xff08;如FL中TB-303的步进灯&#xff09; FL Studio Transistor Bass...

C语言 函数指针详解

一、函数指针 1.1、概念 函数指针&#xff1a;首先它是一个指针&#xff0c;一个指向函数的指针&#xff0c;在内存空间中存放的是函数的地址&#xff1b; 示例&#xff1a; int Add(int x&#xff0c;int y) {return xy;} int main() {printf("%p\n",&Add);…...

LNMP及论坛搭建

安装 Nginx 服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 1.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持&#xff0c;因此需要安装这些软件的开发包&#xff0c;以便提供相应的库和头文件。 yum -y install pcre-devel zlib-devel…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...