UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

引擎源码版,复制\Engine\Source\Programs\路径下的BlankProgram空项目示例。

重命名BlankProgram,例如CustomTcpProgram,并修改项目名称。

 修改.Build.cs内容

修改Target.cs内容 

 

 修改Private文件夹内.h.cpp文件名并修改.cpp内容

刷新引擎

在项目.Build.cs中加入模块

// Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class TCPSocketServer : ModuleRules
{public TCPSocketServer(ReadOnlyTargetRules Target) : base(Target){PublicIncludePathModuleNames.Add("Launch");PrivateDependencyModuleNames.Add("Core");PrivateDependencyModuleNames.Add("Projects");//加入网络模块PrivateDependencyModuleNames.Add("Sockets");PrivateDependencyModuleNames.Add("ApplicationCore");// to link with CoreUObject module:// PrivateDependencyModuleNames.Add("CoreUObject");// to enable tracing:// AppendStringToPublicDefinition("UE_TRACE_ENABLED", "1");// to enable LLM tracing:// GlobalDefinitions.Add("LLM_ENABLED_IN_CONFIG=1");// GlobalDefinitions.Add("UE_MEMORY_TAGS_TRACE_ENABLED=1");}
}

 .cpp

// Copyright Epic Games, Inc. All Rights Reserved.#include "TCPSocketServer.h"#include "RequiredProgramMainCPPInclude.h"
#include "Sockets.h"
#include "SocketSubsystem.h"DEFINE_LOG_CATEGORY_STATIC(LogTCPSocketServer, Log, All);IMPLEMENT_APPLICATION(TCPSocketServer, "TCPSocketServer");INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{//应用初始化设置  GEngineLoop.PreInit(ArgC,ArgV);// 获取网络套接字子系统ISocketSubsystem* SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);// 创建一个TCP类型的套接字,命名为"This TcpIp Type"FSocket* Socket = SocketSubsystem->CreateSocket(NAME_Stream,TEXT("This TcpIp Type"));// 创建一个互联网地址对象,用于指定服务器的IP地址和端口号TSharedPtr<FInternetAddr> Addr = SocketSubsystem->CreateInternetAddr();Addr->SetPort(8888);bool bIsValid = false;Addr->SetIp(TEXT("127.0.0.1"),bIsValid);Socket->Bind(*Addr);Socket->Listen(128);while (true){// 接受一个新的客户端连接请求,并返回一个新的套接字对象来表示这个连接FSocket* ClinetSocket = Socket->Accept(TEXT("ClinetConnect"));// 创建一个字节数组用于存储接收到的数据uint8 Buf[1024]{0};//存储实际读取到的字节数int32 BytesRead = 0;// 从客户端套接字读取数据到Buf数组中,最多读取1024字节,并将实际读取的字节数存储在BytesRead中ClinetSocket->Recv(Buf,1024,BytesRead);// 将接收到的字节数组转换为TCHAR字符串(用于UE5的字符串处理)FString Msg = UTF8_TO_TCHAR(reinterpret_cast<char *>(Buf));UE_LOG(LogTCPSocketServer,Display,TEXT("Msg = %s||Len = %d"),*Msg,BytesRead);}
}
/*
*TArray<FSocket*> Sockets; // 假设这是你的套接字列表  // 遍历套接字列表  
for (int i = 0; i < Sockets.Num(); i++)  
{  
FSocket* Socket = Sockets[i];  
FInternetAddr* RemoteAddr = Socket->GetRemoteAddress();  // 获取远程地址的IP和端口号  
FString IP;  
uint16 Port;  
RemoteAddr->GetIP(IP);  
RemoteAddr->GetPort(Port);  // 使用IP和端口号进行进一步的处理或记录等操作  
UE_LOG(LogTCPSocketServer, Display, TEXT("Client IP: %s, Port: %d"), *IP, Port);  
}
*/

客户端.cpp

// Copyright Epic Games, Inc. All Rights Reserved.#include "TCPSocketClient.h"#include "RequiredProgramMainCPPInclude.h"
#include "Sockets.h"
#include "SocketSubsystem.h"DEFINE_LOG_CATEGORY_STATIC(LogTCPSocketClient, Log, All);IMPLEMENT_APPLICATION(TCPSocketClient, "TCPSocketClient");INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{GEngineLoop.PreInit(ArgC,ArgV);ISocketSubsystem* SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);FSocket* Socket = SocketSubsystem->CreateSocket(NAME_Stream,TEXT("This Tcp Client"));TSharedPtr<FInternetAddr> Addr = SocketSubsystem->CreateInternetAddr();Addr->SetPort(8888);bool bIsValid = false;Addr->SetIp(TEXT("127.0.0.1"),bIsValid);if (Socket->Connect(*Addr)){FString Msg = TEXT("Hello Server");int32 SendSize = 0;Socket->Send(reinterpret_cast<uint8*>(TCHAR_TO_UTF8(*Msg)),Msg.Len(),SendSize);}Socket->Close();SocketSubsystem->DestroySocket(Socket);UE_LOG(LogTCPSocketClient, Display, TEXT("Hello World"));FEngineLoop::AppExit();return 0;
}

未完待续。。。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven环境搭建(打包项目)

Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会&#xff08;非营业的组织&#xff0c;把一些开源软件维护管理起来&#xff09; maven apahce的一个开宇拿项目&#xff0c;是一个优秀的项目构建&#xff08;管理工具&#xff09; maven 管理项目的jar 以及jar与j…

FastAdmin上传图片服务端压缩图片,实测13.45M压缩为29.91K

先前条件&#xff1a;第一步安装compose&#xff0c;已安装忽略。 先上截图看效果 一、在fastadmin的根目录里面输入命令安装think-image composer require topthink/think-image二、找到公共上传类&#xff0c;application/common/library/Upload.php&#xff0c;在最下面…

【python】学习笔记01

一、基础语法 1. 字面量 - 什么是字面量&#xff1f; 在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面量。 - 常用的值类型 Python中常用的有6种值&#xff08;数据&#xff09;的类型。 666 13.14 "程序员"print(666) print(13.14) print(&qu…

excel统计分析——Scheffe法多重比较

参考资料&#xff1a;生物统计学 Scheffe法&#xff08;雪费法&#xff09;多重比较和LSD法一致&#xff0c;但通过k-1作为F分布的第一自由度对临界值进行调整&#xff1a; 其中&#xff0c;k为处理水平数&#xff0c;df为误差自由度&#xff1b;为 excel操作步骤如下&#xf…

基于YOLOv8深度学习的智能肺炎诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

SQL性能分析手段

SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以提供整个服务器执行sql的状态信息。通过如下指令&#xff0c;可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次&#xff1a; -- session 是查看当前会话 ; -- globa…

SpringBoot项目如何优雅的实现操作日志记录

SpringBoot项目如何优雅的实现操作日志记录 前言 在实际开发当中&#xff0c;对于某些关键业务&#xff0c;我们通常需要记录该操作的内容&#xff0c;一个操作调一次记录方法&#xff0c;每次还得去收集参数等等&#xff0c;会造成大量代码重复。 我们希望代码中只有业务相关…

新能源汽车智慧充电桩方案:如何实现充电停车智慧化管理?

一、方案概述 基于新能源汽车充电桩的监管运营等需求&#xff0c;安徽旭帆科技携手合作伙伴触角云共同打造“智能充电设备&#xff0b;云平台&#xff0b;APP小程序”一体化完整的解决方案&#xff0c;为充电桩车位场所提供精细化管理车位的解决办法&#xff0c;解决燃油车恶意…

CHAPTER 9: 《DESIGN A WEB CRAWLER》第9章 《设计一个web爬虫》

CHAPTER 9: 《DESIGN A WEB CRAWLER》第九章 设计一个web爬虫 在本章中&#xff0c;我们将重点介绍网络爬虫设计&#xff1a;一种有趣而经典的系统设计 面试问题。 网络爬虫被称为机器人或蜘蛛。它被搜索引擎广泛用于发现网络上的新内容或更新内容。内容可以是网页、图像、视频…

前端性能优化-重绘与回流

在开发中&#xff0c;页面的性能优化很重要。性能优化的核心目标是提升用户体验&#xff0c;减少页面加载时间&#xff0c;提高页面的响应速度。 而在前端性能优化的过程中&#xff0c;优化重绘&#xff08;repaints&#xff09;与回流&#xff08;reflow&#xff09;是非常关…

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

QT中操作word文档

QT中操作word文档&#xff1a; 参考如下内容&#xff1a; C(Qt) 和 Word、Excel、PDF 交互总结 Qt对word文档操作总结 QT中操作word文档 Qt/Windows桌面版提供了ActiveQt框架&#xff0c;用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成&#xff1a; QAxContainer模…