赞
踩
客户端与服务器的交互,在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层的代码粘贴一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。