客户端与服务器的交互,在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层的代码粘贴一下。