国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

UE4 使用Socket

這篇具有很好參考價(jià)值的文章主要介紹了UE4 使用Socket。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

ue4 socket,ue4,服務(wù)器,運(yùn)維

在配置文件加上Networking。

ue4 socket,ue4,服務(wù)器,運(yùn)維

使用socket加以上頭文件

ue4 socket,ue4,服務(wù)器,運(yùn)維

ue4 socket,ue4,服務(wù)器,運(yùn)維

ue4 socket,ue4,服務(wù)器,運(yùn)維

ue4 socket,ue4,服務(wù)器,運(yùn)維

ue4 socket,ue4,服務(wù)器,運(yùn)維

ue4 socket,ue4,服務(wù)器,運(yùn)維并加上ISocketSubsystem的頭文件

ue4 socket,ue4,服務(wù)器,運(yùn)維

?通過傳過來的IP與端口號進(jìn)行一個(gè)綁定,第一行就是將BindIP分割然后分別放進(jìn)ip的四個(gè)值內(nèi)(A,B,C,D),然后創(chuàng)建一個(gè)FInternetAddr類型的智能指針,將ip的值與外界傳來的端口號對FInternetAddr進(jìn)行一個(gè)初始化賦值,最后對讓socket對地址進(jìn)行一個(gè)綁定。

ue4 socket,ue4,服務(wù)器,運(yùn)維

服務(wù)器進(jìn)行一個(gè)監(jiān)聽,看客戶端是否發(fā)出消息讓服務(wù)器進(jìn)行接收

?ue4 socket,ue4,服務(wù)器,運(yùn)維

?對消息進(jìn)行接收

ue4 socket,ue4,服務(wù)器,運(yùn)維

客戶端發(fā)送消息,先將要發(fā)送的字符串進(jìn)行char的轉(zhuǎn)化。

然后對處理后的數(shù)據(jù)發(fā)送到指定地址

FSocket::HasPendingData將返回一個(gè)值,通知您是否
從套接字讀取是安全的。文章來源地址http://www.zghlxwxcb.cn/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創(chuàng)建的Socket 需要ip和port
	bool BindSocket(const FString& BindIP, const int32 BindPort);

	//監(jiān)聽Socket
	bool ListenSocket(int32 MaxConnectionNum);

	//Accept Client
	bool AcceptSocket();

	//收發(fā)消息
	bool sendMsg(const FString& Msg);

	FString RecvMsg();

	//轉(zhuǎn)換函數(shù)
	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);
}

到了這里,關(guān)于UE4 使用Socket的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • UE4使用定時(shí)器

    上面的文章中,我們創(chuàng)建了一個(gè)門,并且當(dāng)人才上去的時(shí)候,門就會(huì)打開,當(dāng)離開的時(shí)候,門就自動(dòng)關(guān)閉了。大概但是我們希望當(dāng)我們離開以后,至少還要有一段時(shí)間才能關(guān)閉,這時(shí)就用到了定時(shí)器。 定義一個(gè)定時(shí)器句柄 使用定時(shí)器 第一個(gè)參數(shù):把時(shí)間控制權(quán)交給誰,Tim

    2024年02月13日
    瀏覽(25)
  • UE4/5 行為樹使用教程

    UE4/5 行為樹使用教程

    使用行為樹需確保目標(biāo)藍(lán)圖繼承自Character基類,然后根據(jù)本文下面的流程操作即可。 首先需要在 角色自身藍(lán)圖之外 創(chuàng)建一個(gè)新的藍(lán)圖,繼承自AIController: 找到角色自身藍(lán)圖類 設(shè)置中的Pawn一欄 ,掛載剛剛創(chuàng)建的控制器藍(lán)圖: 創(chuàng)建行為樹文件,添加Sequence節(jié)點(diǎn),可以單擊Ne

    2024年02月15日
    瀏覽(20)
  • UE4使用藍(lán)圖材質(zhì)改變顏色

    UE4使用藍(lán)圖材質(zhì)改變顏色

    1.點(diǎn)擊場景中的物體,找到他的材質(zhì),點(diǎn)擊放大鏡找到材質(zhì)的位置并進(jìn)入。 2.找到材質(zhì)的父親,并進(jìn)入。 ?3.該變材質(zhì)的顏色只要改變材質(zhì)的Base Color就行。創(chuàng)建一個(gè)MaterialParameterCollection 添加一個(gè)vector paramter,并給它命名保存。 ?拖動(dòng)它進(jìn)入材質(zhì)的父親,點(diǎn)擊它修改左邊的par

    2024年02月12日
    瀏覽(22)
  • (UE4/UE5)Unreal Engine中使用HLOD

    (UE4/UE5)Unreal Engine中使用HLOD

    本教程將詳細(xì)介紹在Unreal Engine的不同版本(4.20-4.24、4.25-4.26、5.2)中如何使用Hierarchical Level of Detail (HLOD)。注意,每個(gè)版本中使用HLOD的方法可能會(huì)有所不同。 步驟一:預(yù)先生成LOD打開UE4.21,點(diǎn)擊Content Browser(內(nèi)容瀏覽器)中你想要生成LOD的靜態(tài)網(wǎng)格。 步驟二:在靜態(tài)網(wǎng)格編

    2024年02月10日
    瀏覽(27)
  • 使用UE4 HttpRequest提交多表單

    大部分HTTP庫都是支持直接設(shè)置多表單字段的,但UE4的HttpRequest比較慘,只能用SetContent設(shè)置整個(gè)的TArrayuint8作為請求體,所以想要傳多表單就要自己拼。 首先設(shè)置Header,Content-Type設(shè)置為多表單,并設(shè)置boundary: boundary想設(shè)什么都行,但要和后面用的統(tǒng)一。 然后拼請求體的數(shù)據(jù)字

    2024年02月07日
    瀏覽(29)
  • UE4 Take Recorder的使用

    UE4 Take Recorder的使用

    1.設(shè)置鏡頭片段編號、幀率 2.添加要錄制的對象 3.如果勾上,就會(huì)創(chuàng)建如下圖的關(guān)卡序列文件 4.如果勾上,創(chuàng)建的關(guān)卡序列文件會(huì)自動(dòng)鎖定。可點(diǎn)擊紅框鎖圖標(biāo)處解鎖 5.選擇“可擁有”,就不會(huì)實(shí)例化生成一個(gè)Light Source,勾選需要錄制的屬性 6.開始錄制 7.記得保存你的預(yù)設(shè)。

    2024年02月12日
    瀏覽(42)
  • 【虛幻引擎UE】UE4/UE5 功能性插件推薦及使用介紹 2

    【虛幻引擎UE】UE4/UE5 功能性插件推薦及使用介紹 2

    (基于UE5 的Python支持插件) 支持Python語言基于UE5進(jìn)行開發(fā) GIT地址:https://github.com/mamoniem/UnrealEditorPythonScripts (基于UE5 的Haxe支持插件) Haxe是一門新興的開源編程語言,是一種開源的編程語言。支持Haxe語言基于UE5進(jìn)行開發(fā)。 GIT地址:https://github.com/RobertBorghese/Haxe-UnrealEngine

    2024年02月06日
    瀏覽(174)
  • 【虛幻引擎UE】UE4/UE5 GIS輔助類插件推薦及使用介紹

    【虛幻引擎UE】UE4/UE5 GIS輔助類插件推薦及使用介紹

    此插件將虛幻引擎連接到Speckle,允許從Speckle接收版本化的3D數(shù)據(jù),可以實(shí)現(xiàn)Revit、Rhino、Blender、Sketchup、Unity、虛幻引擎、AutoCAD等之間的完全互操作協(xié)作。 這是一個(gè)涵蓋了在展廳、工業(yè)產(chǎn)品或其他3D場景中導(dǎo)航的許多可能性的系統(tǒng)。在窗口、觸摸屏、手機(jī)和Html5上。 只需快速

    2024年02月07日
    瀏覽(117)
  • 【虛幻引擎UE】UE4/UE5 功能性插件推薦及使用介紹 1

    【虛幻引擎UE】UE4/UE5 功能性插件推薦及使用介紹 1

    實(shí)現(xiàn)POST/GET基本方法,并支持HEAD帶信息。 使用案例:【虛幻引擎UE】UE5 三種模式調(diào)用API詳解(案例基于免費(fèi)Varest插件) 能夠快速實(shí)現(xiàn)打開對話框獲取數(shù)據(jù)的導(dǎo)入、導(dǎo)出路徑。 某月限免插件,比較方便的地圖插件,可以改改樣式直接用。 http下載數(shù)據(jù)到指定路徑 按空格可以切

    2023年04月11日
    瀏覽(104)
  • UE4/5Niagara粒子特效學(xué)習(xí)(使用UE5.1,適合新手)

    UE4/5Niagara粒子特效學(xué)習(xí)(使用UE5.1,適合新手)

    目錄 創(chuàng)建空模板 創(chuàng)建粒子 粒子的基礎(chǔ)屬性 粒子的生命周期 顏色 ?大小設(shè)置 生成的位置 Skeletal Mesh Location的效果: Shape Location 添加速度 添加Noise力場 在生成中添加: 效果: ??編輯 在更新中添加: 效果: 控制粒子過程的大小 ??控制粒子過程的顏色 ?添加風(fēng)的立場 結(jié)束

    2024年02月12日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包