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;
}

未完待续。。。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: UE4(Unreal Engine 4)是一款强大的游戏开发引擎,它提供了多种网络功能,包括TCP客户端。 在UE4中,可以通过蓝图或C++代码实现TCP客户端。首先需要创建一个Socket对象并将其连接到服务器。可以使用Socket子系统来处理与TCP服务器的通信。 在连接建立之后,可以使用Socket对象发送和接收数据。可以使用Socket的Send()函数向服务器发送数据,使用Recv()函数接收服务器的响应数据。 在客户端代码中,可以根据游戏逻辑和需求,编写相应的处理逻辑。例如,可以使用线程来异步接收服务器的响应数据,并在主线程中处理接收到的数据。 同时,需要在客户端代码中处理TCP连接的错误和异常情况,以确保网络通信的稳定性和可靠性。可以使用Try/Catch块来捕获可能发生的异常,并进行相应的处理。 除了基本的TCP客户端功能,UE4还提供了其他更高级的网络功能,如RPC(Remote Procedure Call)和Replication(复制),用于处理远程函数调用和多人游戏中的数据同步等问题。 总的来说,UE4提供了方便易用的TCP客户端功能,开发人员可以根据自己的需求使用蓝图或C++代码编写相应的网络逻辑,实现与服务器的通信。 ### 回答2: UE4是一款流行的游戏引擎,它提供了强大的功能和工具,用于开发高质量的游戏和应用程序。UE4通过使用蓝图和C++编程语言来创建游戏逻辑和功能。 UE4中的TCP客户端是一种用于建立基于TCP/IP协议的网络通信的工具。TCP(传输控制协议)是一种可靠的连接型协议,它能够确保数据的可靠传输和顺序传递。TCP客户端可以与远程服务器进行通信,发送和接收数据。 在UE4中创建TCP客户端需要以下步骤: 1. 导入网络模块:首先,需要在UE4项目中导入网络模块,以在蓝图或代码中使用相应的网络功能。 2. 创建TCP套接字:通过使用UE4提供的套接字类创建一个TCP套接字对象。套接字是一种网络通信的接口,它可以在客户端服务器之间建立连接。 3. 连接到服务器:使用套接字对象的Connect函数来连接到远程服务器。在连接之前,需要提供服务器的IP地址和端口号。 4. 发送和接收数据:一旦连接建立成功,可以使用套接字对象的Send和Receive函数来发送和接收数据。可以通过字符串或字节数组的方式发送和接收数据。 5. 关闭连接:当通信结束时,需要使用套接字对象的Close函数来关闭连接,并释放相关资源。 通过以上步骤,我们就可以在UE4中创建一个TCP客户端,实现与远程服务器的通信。这样可以打开许多可能性,比如实时多人游戏中的玩家之间的通信、在线排行榜的更新等等。TCP客户端网络通信中具有可靠性和稳定性,因此在很多场景下都是一个重要的组件。 ### 回答3: UE4是一款强大的游戏开发引擎,支持使用TCP协议进行网络通信。下面是关于UE4 TCP客户端的详细说明: 首先,UE4提供了一系列的网络编程功能来实现TCP客户端。要创建一个TCP客户端,首先需要在项目中添加网络功能模块。然后,在游戏中创建一个Socket对象,该对象将用于与服务器进行通信。 接下来,需要通过Socket对象连接到服务器。在连接之前,需要指定服务器的IP地址和端口号。一旦连接成功,就可以通过Socket对象发送和接收消息。 要发送消息,可以使用UE4的Send方法,通过Socket对象将消息数据发送给服务器。要接收消息,可以使用UE4的Recv方法,通过Socket对象从服务器接收消息数据。使用这些方法可以实现与服务器的双向通信。 在实际应用中,可以根据游戏的需求和设计来使用TCP客户端。例如,可以在游戏中实现多人联机功能,通过TCP客户端来与其他玩家进行通信。还可以使用TCP客户端在游戏中获取服务器提供的数据,例如排行榜信息或者游戏状态更新等。 总结来说,UE4提供了丰富的网络编程功能,可以轻松实现TCP客户端。通过连接服务器、发送和接收消息,可以与服务器进行双向通信。这为游戏开发者提供了很多可能性,可以实现各种有趣的网络功能和游戏玩法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我救我自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值