客戶端與服務器的交互,在ue4 中提供了一個插件,可以以藍圖的方式使用該插件。參考鏈接
本文提供的是基於UserWidget類,用c++代碼實現。裏邊涉及的有Http請求,Json數據處理,中文亂碼解決。
正文:
新建一個ue4 c++ 工程,基於Userwidget c++類創建一個NetWidget。別忘了自己搞定一個番茄插件,不然頭文件引用自己想辦法解決。
NetWidget.h 文件如下
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "IHttpRequest.h"
#include "NetWidget.generated.h"
/**
*
*/
UCLASS()
class FRAMECOURSE_API UNetWidget : public UUserWidget
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, Category = "Network")
void SendMsgToServer(FString name, FString password);
void RequestComplete(FHttpRequestPtr RequestPtr, FHttpResponsePtr ResponsePtr, bool bIsSuccess);
};
NetWidget.cpp
#include "NetWidget.h"
#include "CondensedJsonPrintPolicy.h"
#include "HttpModule.h"
#include "IHttpRequest.h"
#include "IHttpResponse.h"
#include "JsonReader.h"
#include "JsonObject.h"
#include "JsonSerializer.h"
#include "Common/FWCommon.h" // 這個是我自己封裝的工具類,打印信息用的,沒有就用系統自帶的
void UNetWidget::SendMsgToServer(FString name, FString password)
{
FString server_data;
// 創建json
// TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(server_data);
TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&server_data);
// 開啓json 寫入
JsonWriter->WriteObjectStart();
//// 寫入數據
JsonWriter->WriteValue("name", name);
JsonWriter->WriteValue("password", password);
//// 關閉寫入
JsonWriter->WriteObjectEnd();
//// 關閉Json 寫入
JsonWriter->Close();
// 創建Http 請求
TSharedRef<IHttpRequest> Request = FHttpModule::Get().CreateRequest();
// 設置請求頭
Request->SetHeader("Content-Type","text/javascript;charset=utf-8");
// 設置請求方式
Request->SetVerb("POST");
// 請求的鏈接
Request->SetURL("192.168.5.21:8000/test_ue4"); // 服務端預留的測試接口
// 內容包
//Request->SetContentAsString(server_data);
// 設置回調函數
Request->OnProcessRequestComplete().BindUObject(this, &UNetWidget::RequestComplete);
// 發送請求
Request->ProcessRequest();
}
void UNetWidget::RequestComplete(FHttpRequestPtr RequestPtr, FHttpResponsePtr ResponsePtr, bool bIsSuccess)
{
if (!EHttpResponseCodes::IsOk(ResponsePtr->GetResponseCode())) return;
// 獲得返回的json數據
TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(ResponsePtr->GetContentAsString());
// 把FString轉成TCHAR
TCHAR* serializedChar = ResponsePtr->GetContentAsString().GetCharArray().GetData();
// 解決中文亂碼問題,服務端也是utf-8
TCHAR_TO_UTF8(serializedChar);
FString myData(serializedChar);
// 打印信息
FWHelper::Debug(myData);
// 創建Json對象
TSharedPtr<FJsonObject> JsonObject;
// 反序列化json
bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
// 判斷是否反序列化成功
if (bIsOk)
{
FString data = JsonObject->GetStringField("data");
FWHelper::Debug(data);
}
}
代碼粘貼完畢,不代表***完事大吉***,還要在項目中引入相應的模塊。在項目名稱.Build.cs 中添加相應的模塊,比如***json,http***
using UnrealBuildTool;
public class FrameCourse : ModuleRules
{
public FrameCourse(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","UMG","Http","Json", "JsonUtilities" });
PrivateDependencyModuleNames.AddRange(new string[] { "Http", "Json", "JsonUtilities" });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
服務器端是用python的django框架,這個自己去學習把,只把view層的代碼粘貼一下。