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

UE5 C++的TCP服務器與客戶端

這篇具有很好參考價值的文章主要介紹了UE5 C++的TCP服務器與客戶端。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?客戶端.h

需要在Build.cs中加入模塊:"Networking","Sockets","Json","JsonUtilities"

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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ClientActorClass.generated.h"

UCLASS()
class TCPSERVERANDCLIENT_API AClientActorClass : public AActor
{
	GENERATED_BODY()

public:
	// Sets default values for this actor's properties
	AClientActorClass();

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

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

	static FSocket* Socket;

	//"Networking","Sockets"
	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static bool ClientConnectToTCPServer(const FString& IP,int32 Port = 8888);

	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static bool SendDataFormClicentToServer(TArray<uint8> SendData);

	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static bool DisConnectFormClientToServer();

	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static TArray<uint8> ReceiveDataFromTCPServer();

	//"Json","JsonUtilities"
	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static void StringToBytes(FString InString,bool& OutBool,TArray<uint8>& OutBytesArray);

	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static void DataTypeToJSON(int32 Int,bool Inbool,FString String,FVector Vector,TArray<int32> Array,bool& OutBool,TArray<uint8>& OutBytesArray);

	UFUNCTION(BlueprintCallable,Category = "TCPServerAndClient")
	static void BytesToString(TArray<uint8> InBytesArray,FString& OutString);
};

?客戶端.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-800412.html

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


#include "ClientActorClass.h"

#include "Sockets.h"
#include "Internationalization/Text.h"
#include "Misc/OutputDevice.h"
#include "Internationalization/Internationalization.h"
#include "Common/TcpSocketBuilder.h"

FSocket* AClientActorClass::Socket = nullptr;
// Sets default values
AClientActorClass::AClientActorClass()
{
	// 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;
}

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

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

bool AClientActorClass::ClientConnectToTCPServer(const FString& IP, int32 Port)
{
	if (Socket)
	{
		Socket->Close();
		ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(Socket);
		Socket = nullptr;
	}

	TSharedPtr<FInternetAddr> Addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
	bool bIsValid;
	Addr->SetIp(*IP,bIsValid);
	Addr->SetPort(Port);

	if (!bIsValid)
	{
		UE_LOG(LogTemp,Log,TEXT("InValid IP Address"));
		GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,TEXT("InValid IP Address"));
		return false;
	}
	Socket = FTcpSocketBuilder(TEXT("TcpClient")).AsBlocking().WithReceiveBufferSize(2*1024*1024);

	bool bConnected = Socket->Connect(*Addr);
	if (!bConnected)
	{
		UE_LOG(LogTemp,Log,TEXT("Failed Connect To Server"));
		GEngine->AddOnScreenDebugMessage(-1,5.0,FColor::Green,TEXT("Failed Connect To Server"));
		return false;
	}
	UE_LOG(LogTemp,Log,TEXT("Success Connect To Server"));
	GEngine->AddOnScreenDebugMessage(-1,5.0,FColor::Green,TEXT("Success Connect To Server"));

	return true;
	
}

bool AClientActorClass::SendDataFormClicentToServer(TArray<uint8> SendData)
{
	if (!Socket)
	{
		UE_LOG(LogTemp, Log, TEXT("Socket is not connected!"));
		return false;
	}

	// 發(fā)送數(shù)據(jù)部分
	int32 SentBytes = 0;
	bool bSuccess = Socket->Send(SendData.GetData(), SendData.Num(), SentBytes);

	if (!bSuccess || SentBytes != SendData.Num())
	{
		UE_LOG(LogTemp, Log, TEXT("Failed to send data!"));
		return false;
	}
	GEngine->AddOnScreenDebugMessage(-1,5.0,FColor::Green,TEXT("Success to send data!"));
	UE_LOG(LogTemp, Log, TEXT("Success to send data!"));
	return true;
}

bool AClientActorClass::DisConnectFormClientToServer()
{
	if (Socket)
	{
		Socket->Close();
		ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(Socket);
		Socket = nullptr;
		return true;
	}
	return false;
}

TArray<uint8> AClientActorClass::ReceiveDataFromTCPServer()
{
	TArray<uint8> Bytes;

	if (Socket)
	{
		uint32 Size;
		while (Socket->HasPendingData(Size))
		{
			Bytes.SetNumUninitialized(FMath::Min(Size, 65507u));

			int32 ReadBytes = 0;
			// 讀取數(shù)據(jù)到字節(jié)流中
			Socket->Recv(Bytes.GetData(), Bytes.Num(), ReadBytes);

			// 將實際讀取的部分截取出來
			Bytes.SetNum(ReadBytes);

			// 如果需要等待接收完整數(shù)據(jù)再返回,可以設置一個條件,比如接收到特定結束標志
			// 如果已經接收到完整數(shù)據(jù),可以直接返回
			return Bytes;
		}
	}

	// 如果沒有接收到數(shù)據(jù),返回空字節(jié)流
	return TArray<uint8>();
}

void AClientActorClass::StringToBytes(FString InString, bool& OutBool, TArray<uint8>& OutBytesArray)
{
	OutBytesArray.Empty();
	
	if (!InString.IsEmpty())
	{
		FTCHARToUTF8 Converter(*InString);
		int32 NumBytes = Converter.Length();
		if (NumBytes > 0)
		{
			OutBytesArray.Append((uint8*)Converter.Get(), NumBytes);
			OutBool = true;
		}
		else
		{
			OutBool = false;
		}
	}
	else
	{
		OutBool = false;
	}
}

void AClientActorClass::DataTypeToJSON(int32 Int, bool Inbool, FString String, FVector Vector, TArray<int32> Array,
	bool& OutBool, TArray<uint8>& OutBytesArray)
{
	OutBytesArray.Empty();
	
	TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);

	JsonObject->SetNumberField("MyInteger",Int);
	JsonObject->SetBoolField("MyBool",Inbool);
	JsonObject->SetStringField("MyString",String);

	TSharedPtr<FJsonObject> VectorObject = MakeShareable(new FJsonObject);
	JsonObject->SetNumberField("MyVector",Vector.X);
	JsonObject->SetNumberField("MyVector",Vector.Y);
	JsonObject->SetNumberField("MyVector",Vector.Z);

	JsonObject->SetObjectField("MyVector",VectorObject);
	
	TArray<TSharedPtr<FJsonValue>> JsonArray;
	for (auto& value : Array)
	{
		JsonArray.Add(MakeShareable(new FJsonValueNumber(value)));		
	}
	JsonObject->SetArrayField("Array",JsonArray);

	// 將 JSON 對象轉換為字符串  
	FString OutputString;
	TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
	if (FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer))
	{
		Writer->Close();

		// 將字符串轉換為字節(jié)數(shù)組  
		FTCHARToUTF8 Converter(*OutputString);
		int32 NumBytes = Converter.Length();
		if (NumBytes > 0)
		{
			OutBytesArray.Append((uint8*)Converter.Get(), NumBytes);
			OutBool = true;
		}
		else
		{
			OutBool = false;
		}
	}
	else
	{
		OutBool = false;
	}
}

void AClientActorClass::BytesToString(TArray<uint8> InBytesArray, FString& OutString)
{
	// 檢查字節(jié)數(shù)組是否為空
	if (InBytesArray.Num() == 0)
	{
		OutString.Empty();
		GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Blue, TEXT("data = null"));
		UE_LOG(LogTemp, Log, TEXT("data = null"));
		return;
	}

	// 將字節(jié)流轉換為UTF-8字符串
	FString Utf8String = FUTF8ToTCHAR(reinterpret_cast<const ANSICHAR*>(InBytesArray.GetData()), InBytesArray.Num()).Get();

	// 在這里你可以使用Utf8String進行其他操作,例如將其轉換為JSON對象
	// 注意:在UE5中,你可能需要使用FJsonSerializer的Deserialize方法
	TSharedPtr<FJsonObject> JsonObject;
	TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(Utf8String);

	// Deserialize JSON
	if (FJsonSerializer::Deserialize(Reader, JsonObject))
	{
		// 在這里可以使用JsonObject進行其他操作
	}
	else
	{
		// JSON解析失敗的處理
		UE_LOG(LogTemp, Error, TEXT("Failed to parse JSON from string"));
	}

	// 將最終的JSON字符串賦值給輸出參數(shù)
	OutString = Utf8String;
}

到了這里,關于UE5 C++的TCP服務器與客戶端的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • TCP實現(xiàn)服務器和客戶端通信

    TCP實現(xiàn)服務器和客戶端通信

    目錄 TCP介紹 代碼實現(xiàn) server(服務器端) 代碼分析 client(客戶端) 代碼分析 結果展示 TCP (Transmission Control Protocol) 是一種面向連接的協(xié)議,用于在計算機網絡中傳輸數(shù)據(jù)。TCP 可以確保數(shù)據(jù)的可靠傳輸,即使在網絡環(huán)境不穩(wěn)定的情況下也能夠保證數(shù)據(jù)的完整性和順序。以下是

    2024年02月15日
    瀏覽(39)
  • 簡易TCP客戶端和服務器端通信

    #includeiostream #include winsock2.h ? #include ws2tcpip.h ? #includestdlib.h using namespace std; #define ?BUF_SIZE ?1024 int main() { ? ? cout \\\"客戶端\\\" endl; ? ? //設置Winsock版本, ? ? WSADATA ? wsaData; ? ? if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0) ? ? { ? ? ? ? cout \\\"error\\\" endl; ? ? ? ? exit(1); ? ? } ? ? //創(chuàng)建通

    2024年04月29日
    瀏覽(23)
  • 【Micropython基礎】TCP客戶端與服務器

    【Micropython基礎】TCP客戶端與服務器

    MicroPython 是 Python 的一種精簡實現(xiàn),旨在運行于微控制器和嵌入式系統(tǒng)等資源受限的環(huán)境中。它提供了一種簡單而強大的方式來編寫和運行 Python 代碼,使開發(fā)人員能夠快速地創(chuàng)建各種嵌入式應用程序。 在嵌入式系統(tǒng)中,網絡通信是一個常見的需求,而 TCP(傳輸控制協(xié)議)是

    2024年04月28日
    瀏覽(30)
  • TCP客戶端及服務器端開發(fā)實踐

    TCP客戶端及服務器端開發(fā)實踐

    ① TCP客戶端應用程序開發(fā) ② TCP服務器端應用程序開發(fā) 客戶端程序是指運行在用戶設備上的程序,服務端程序是指運行在服務器設備上的程序,專門為客戶端提供數(shù)據(jù)服務。那如何記憶呢? 主動發(fā)起建立連接請求的是客戶端程序,等待接受連接請求的是服務端程序。 開發(fā)流

    2024年04月09日
    瀏覽(27)
  • TCP服務器監(jiān)測客戶端異常退出方法

    ????????作為服務器必須得具備監(jiān)測客戶端狀態(tài)得機制,以保證客戶端處于不同的狀態(tài),服務器進行不同得狀態(tài)處理,依次來提高實時性,可控性,并且有利于服務器得內存管理。其中客戶端得異常處理就屬于其中得一種。 ????????客戶端得斷開情形無非就兩種情況:

    2024年02月09日
    瀏覽(33)
  • 用C語言搭建TCP服務器/客戶端

    用C語言搭建TCP服務器/客戶端

    1.TCP流程圖 2.TCP編程 服務器 客戶端 ????????以上就是用c語言搭建的tcp服務器和客戶端,IP地址的地方可以根據(jù)自己本機的IP地址去修改(在命令提示符中可以使用ifconfig命令查看本機IP地址),端口號用的是6666,也可自己修改,但是IP地址和端口號服務器和客戶端必須一至。

    2024年02月09日
    瀏覽(25)
  • tcp服務器端與多個客戶端連接

    tcp服務器端與多個客戶端連接

    如果希望Tcp服務器端可以與多個客戶端連接,可以這樣寫: 相關的槽函數(shù)中: 使用sender()來獲取對應的QTcpSocket對象。 其實,主要就是QTcpServer進行監(jiān)聽: 客戶端的QTcpSocket與服務器端的QTcpSocket進行通信。

    2024年04月28日
    瀏覽(48)
  • TCP通信實現(xiàn)客戶端向服務器發(fā)送圖片

    TCP通信實現(xiàn)客戶端向服務器發(fā)送圖片

    TCP通信: 1. TCP 協(xié)議通信交互流程: 具體的流程如下: (1)服務器根據(jù)地址類型(ipv4、ipv6)、socket 類型、協(xié)議創(chuàng)建 socket. (2)服務器為 socket 綁定 ip 地址和端口號。 (3)服務器 socket 監(jiān)聽端口號的請求,隨時準備接受來自客戶端的連接,此時服務器的 socket 處于關閉狀態(tài)

    2024年02月13日
    瀏覽(31)
  • day-03 基于TCP的服務器端/客戶端

    day-03 基于TCP的服務器端/客戶端

    TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是兩種常見的傳輸層協(xié)議,用于在計算機網絡中提供可靠的數(shù)據(jù)傳輸。 1.TCP: 連接導向 :TCP是一種面向連接的協(xié)議,通信雙方在數(shù)據(jù)傳輸前需要先建立可靠的連接。 可靠性 :TCP提供可靠的數(shù)據(jù)傳輸,通過使用序列號、確

    2024年02月10日
    瀏覽(28)
  • Qt多線程TCP服務器客戶端傳輸文件

    Qt多線程TCP服務器客戶端傳輸文件

    TCP是面向連接的運輸層協(xié)議。應用程序在使用TCP協(xié)議之前,必須先建立TCP連接。在傳送數(shù)據(jù)完畢后,必須釋放已經建立的TCP連接。 每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點的(一對一)。 TCP提供可靠交付的服務。通過TCP 連接傳送的數(shù)據(jù),無差錯、不丟失、不

    2024年02月13日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包