UE4 使用Socket

这篇具有很好参考价值的文章主要介绍了UE4 使用Socket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ue4 socket,ue4,服务器,运维

在配置文件加上Networking。

ue4 socket,ue4,服务器,运维

使用socket加以上头文件

ue4 socket,ue4,服务器,运维

ue4 socket,ue4,服务器,运维

ue4 socket,ue4,服务器,运维

ue4 socket,ue4,服务器,运维

ue4 socket,ue4,服务器,运维

ue4 socket,ue4,服务器,运维并加上ISocketSubsystem的头文件

ue4 socket,ue4,服务器,运维

 通过传过来的IP与端口号进行一个绑定,第一行就是将BindIP分割然后分别放进ip的四个值内(A,B,C,D),然后创建一个FInternetAddr类型的智能指针,将ip的值与外界传来的端口号对FInternetAddr进行一个初始化赋值,最后对让socket对地址进行一个绑定。

ue4 socket,ue4,服务器,运维

服务器进行一个监听,看客户端是否发出消息让服务器进行接收

 ue4 socket,ue4,服务器,运维

 对消息进行接收

ue4 socket,ue4,服务器,运维

客户端发送消息,先将要发送的字符串进行char的转化。

然后对处理后的数据发送到指定地址

FSocket::HasPendingData将返回一个值,通知您是否
从套接字读取是安全的。文章来源地址https://www.toymoban.com/news/detail-618033.html

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Networking/Public/Interfaces/IPv4/IPv4Address.h"
#include "ServerSocket.generated.h"

UCLASS()
class MYCTEST_API AServerSocket : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AServerSocket();

	FSocket* ServerSocket;
	FSocket* ClientSocket;

	FTimerHandle SocketTimerHandle;

	FIPv4Address ip;

	FVector currentLoc;

	float SocketDelta;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	virtual void EndPlay(const EEndPlayReason::Type EEndPlayReason);

	bool CreateSocket();

	//Bind创建的Socket 需要ip和port
	bool BindSocket(const FString& BindIP, const int32 BindPort);

	//监听Socket
	bool ListenSocket(int32 MaxConnectionNum);

	//Accept Client
	bool AcceptSocket();

	//收发消息
	bool sendMsg(const FString& Msg);

	FString RecvMsg();

	//转换函数
	FString StringFromBinaryArray(const TArray<uint8>& BinaryArray) {
		return FString(ANSI_TO_TCHAR(reinterpret_cast<const char*>(BinaryArray.GetData())));
	}

	UFUNCTION(BlueprintCallable)
	void Test(const FString &BindIP, const int32 Port, const int32 MaxListener);

	void HandleFunc();
};
// Fill out your copyright notice in the Description page of Project Settings.


#include "ServerSocket.h"
#include "SocketSubsystem.h"
#include "Sockets.h"
#include "Engine/World.h"
#include "TimerManager.h"
#include "Kismet/KismetStringLibrary.h"
#include "UObject/ConstructorHelpers.h"
#include "Components/StaticMeshComponent.h"
#include "Engine/StaticMesh.h"

// Sets default values
// Called when the game starts or when spawned

#define SPHERE_PATH TEXT("/Game/StarterContent/Shapes/Shape_Sphere")

AServerSocket::AServerSocket()
{
	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	currentLoc = FVector(0.f, 0.f, 0.f);
	UStaticMeshComponent* staticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	struct FContructor {
		ConstructorHelpers::FObjectFinderOptional<UStaticMesh> Mesh;
		FContructor() : Mesh(SPHERE_PATH) {}
	};

	static FContructor ConstructorStatics;

	auto tempMesh = ConstructorStatics.Mesh;

	staticMeshComponent->SetupAttachment(RootComponent);

	if (tempMesh.Succeeded()) {
		staticMeshComponent->SetStaticMesh(tempMesh.Get());
	}

}

// Called when the game starts or when spawned
void AServerSocket::BeginPlay()
{
	Super::BeginPlay();

#if 0
	APlayerController* myPlayerController = UGameplayStatics::GetPlayerController(this, 0);

	if (myPlayerController) {
		this->EnableInput(myPlayerController);
	}
#endif

}

// Called every frame
void AServerSocket::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	SocketDelta = DeltaTime;
	AddActorWorldOffset(currentLoc);
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::Printf(TEXT("%d-%d-%d"), currentLoc.X, currentLoc.Y, currentLoc.Z));
}

void AServerSocket::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	Super::EndPlay(EndPlayReason);
	if (ServerSocket) {
		ServerSocket->Close();
		ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(ServerSocket);
	}
	if (ClientSocket) {
		ClientSocket->Close();
		ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(ClientSocket);
	}

}

bool AServerSocket::CreateSocket()
{
	ServerSocket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, "Send Information", false);
	if (!ServerSocket) {
		return false;
	}

	return true;
}

bool AServerSocket::BindSocket(const FString& BindIP, const int32 BindPort)
{
	FIPv4Address::Parse(BindIP, ip);
	TSharedPtr<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
	addr->SetIp(ip.Value);
	addr->SetPort(BindPort);
	bool bBind = ServerSocket->Bind(*addr);

	return bBind;
}

bool AServerSocket::ListenSocket(int32 MaxConnectionNum)
{
	ServerSocket->Listen(MaxConnectionNum);

	return false;
}

bool AServerSocket::AcceptSocket()
{
	ClientSocket = ServerSocket->Accept("Send Information");

	if (!ClientSocket)	return false;

	return true;
}

bool AServerSocket::sendMsg(const FString& Msg)
{
	TSharedPtr<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
	FText outputSample = FText::FromString(addr->ToString(false));
	GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Yellow, addr->ToString(true));
	FString tempMsg = Msg;
	TCHAR* MsgChar = tempMsg.GetCharArray().GetData();
	int32 size = FCString::Strlen(MsgChar) + 1;
	int sent = 0;
	bool bSend;
	if (ClientSocket) {
		bSend = ClientSocket->SendTo((uint8*)TCHAR_TO_UTF8(MsgChar), size, sent, *addr);
	}
	bSend ? GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Socket Sent Success")) : GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Socket Failed"));

	return bSend;
}

FString AServerSocket::RecvMsg()
{
	TSharedPtr<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
	TArray<uint8> ReceiveData;
	FString ReceivedUE4String = "";
	uint32 Size;

	if (ClientSocket->HasPendingData(Size)) {
		uint8* Recv = new uint8[Size];
		ReceiveData.SetNumUninitialized(FMath::Min(Size, 65507u));
		int32 ByteRead = 0;
		ClientSocket->RecvFrom(ReceiveData.GetData(), ReceiveData.Num(), ByteRead, *addr);
		if (ReceiveData.Num() > 0) {
			GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Data Bytes Read-> %d"), ReceiveData.Num()));
			ReceivedUE4String = StringFromBinaryArray(ReceiveData);
			GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Data String Read-> %d"), ReceiveData.Num()));
		}
		else {
			GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Data Byte Read Failed"), ReceiveData.Num()));
		}
		return ReceivedUE4String;
	}

	return ReceivedUE4String;
}

void AServerSocket::Test(const FString& BindIP, const int32 Port, const int32 MaxListener) {
	if (CreateSocket()) {
		if (BindSocket(BindIP, Port)) {
			if (ListenSocket(MaxListener)) {
				if (AcceptSocket()) {
					UWorld* world = GetWorld();
					world->GetTimerManager().SetTimer(SocketTimerHandle, this, &AServerSocket::HandleFunc, SocketDelta, true);
				}
			}
		}
	}
}

void AServerSocket::HandleFunc()
{
	bool outIsValid = false;
	UKismetStringLibrary::Conv_StringToVector(RecvMsg(), currentLoc, outIsValid);
}

到了这里,关于UE4 使用Socket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ue4 Insights的使用

    1.运行UnrealInsights.exe 2.执行独立进程或者打包exe 这时会发现Insights自动创建并开始运行了一个Trace Sessions,持续记录到.utrace文件中 .utrace文件路径 3.也可以通过连接IP地址,获取到该计算机的UE程序。状态为LIVE实时 4.点击右下角Open按钮,弹出UnrealInsights窗口。如果发现没有持续

    2024年02月12日
    浏览(28)
  • UE4/5 行为树使用教程

    使用行为树需确保目标蓝图继承自Character基类,然后根据本文下面的流程操作即可。 首先需要在 角色自身蓝图之外 创建一个新的蓝图,继承自AIController: 找到角色自身蓝图类 设置中的Pawn一栏 ,挂载刚刚创建的控制器蓝图: 创建行为树文件,添加Sequence节点,可以单击Ne

    2024年02月15日
    浏览(28)
  • UE4使用蓝图材质改变颜色

    1.点击场景中的物体,找到他的材质,点击放大镜找到材质的位置并进入。 2.找到材质的父亲,并进入。  3.该变材质的颜色只要改变材质的Base Color就行。创建一个MaterialParameterCollection 添加一个vector paramter,并给它命名保存。  拖动它进入材质的父亲,点击它修改左边的par

    2024年02月12日
    浏览(41)
  • (UE4/UE5)Unreal Engine中使用HLOD

    本教程将详细介绍在Unreal Engine的不同版本(4.20-4.24、4.25-4.26、5.2)中如何使用Hierarchical Level of Detail (HLOD)。注意,每个版本中使用HLOD的方法可能会有所不同。 步骤一:预先生成LOD打开UE4.21,点击Content Browser(内容浏览器)中你想要生成LOD的静态网格。 步骤二:在静态网格编

    2024年02月10日
    浏览(34)
  • UE4 Take Recorder的使用

    1.设置镜头片段编号、帧率 2.添加要录制的对象 3.如果勾上,就会创建如下图的关卡序列文件 4.如果勾上,创建的关卡序列文件会自动锁定。可点击红框锁图标处解锁 5.选择“可拥有”,就不会实例化生成一个Light Source,勾选需要录制的属性 6.开始录制 7.记得保存你的预设。

    2024年02月12日
    浏览(39)
  • 使用UE4 HttpRequest提交多表单

    大部分HTTP库都是支持直接设置多表单字段的,但UE4的HttpRequest比较惨,只能用SetContent设置整个的TArrayuint8作为请求体,所以想要传多表单就要自己拼。 首先设置Header,Content-Type设置为多表单,并设置boundary: boundary想设什么都行,但要和后面用的统一。 然后拼请求体的数据字

    2024年02月07日
    浏览(27)
  • 【虚幻引擎UE】UE4/UE5 GIS辅助类插件推荐及使用介绍

    此插件将虚幻引擎连接到Speckle,允许从Speckle接收版本化的3D数据,可以实现Revit、Rhino、Blender、Sketchup、Unity、虚幻引擎、AutoCAD等之间的完全互操作协作。 这是一个涵盖了在展厅、工业产品或其他3D场景中导航的许多可能性的系统。在窗口、触摸屏、手机和Html5上。 只需快速

    2024年02月07日
    浏览(61)
  • 【虚幻引擎UE】UE4/UE5 功能性插件推荐及使用介绍 2

    (基于UE5 的Python支持插件) 支持Python语言基于UE5进行开发 GIT地址:https://github.com/mamoniem/UnrealEditorPythonScripts (基于UE5 的Haxe支持插件) Haxe是一门新兴的开源编程语言,是一种开源的编程语言。支持Haxe语言基于UE5进行开发。 GIT地址:https://github.com/RobertBorghese/Haxe-UnrealEngine

    2024年02月06日
    浏览(71)
  • 【虚幻引擎UE】UE4/UE5 功能性插件推荐及使用介绍 1

    实现POST/GET基本方法,并支持HEAD带信息。 使用案例:【虚幻引擎UE】UE5 三种模式调用API详解(案例基于免费Varest插件) 能够快速实现打开对话框获取数据的导入、导出路径。 某月限免插件,比较方便的地图插件,可以改改样式直接用。 http下载数据到指定路径 按空格可以切

    2023年04月11日
    浏览(63)
  • UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

    目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色  大小设置 生成的位置 Skeletal Mesh Location的效果: Shape Location 添加速度 添加Noise力场 在生成中添加: 效果:  ​编辑 在更新中添加: 效果: 控制粒子过程的大小   控制粒子过程的颜色  添加风的立场 结束

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包