我有一个客户端应用程序,通过UDP将命令发送到另一个应用程序,服务器。 客户端和服务器应用程序都在同一台计算机上运行。
首先,如果需要,可以参考,这是几个小时前我之前发布的帖子的链接:c++ deserialize object sent from c# application via UDP
我的客户端应用程序在C#中。它只是获取用户按下的键,按下按键的时间戳,并在我的班级“包”中将两者捆绑在一起。接下来,“Package”被序列化为JSON:
< uint16_t >
客户端然后通过UDP将此json发送到我的远程应用程序,即服务器应用程序,该应用程序恰好是Unreal Engine 4.10应用程序:
Package package = new Package();
package.RoundTripDelay = DateTime.Now;
package.PressedKey = MOVEMENT.Forward;
var json = new JavaScriptSerializer().Serialize(package);
在服务器端,收到json,然后使用rapidjson library进行解析。
我不会详细介绍服务器代码的外观,但为了让您全面了解,下面是我如何处理传入的UDP数据包:
UE4服务器应用程序
byte[] bytes = Encoding.ASCII.GetBytes(json);
client.Send(bytes, bytes.Length, ip);
现在,忽略这里有一些遗漏错误检查的事实。问题是,当我点击“w”(对应于void AUDPActor::ProcessUDPPacket(TArray<uint8> packetData) {
FString message = StringFromBinaryArray(packetData);
string receivedJson(TCHAR_TO_UTF8(*message));
ProcessJSONUDPPacket(receivedJson);
//Display the received message on the GUI.
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, message);
}
//Handy function from RAMA.
FString AUDPActor::StringFromBinaryArray(const TArray<uint8>& BinaryArray)
{
//Create a string from a byte array!
const std::string cstr(reinterpret_cast<const char*>(BinaryArray.GetData()),
BinaryArray.Num());
//FString can take in the c_str() of a std::string
return FString(cstr.c_str());
}
void AUDPActor::ProcessJSONUDPPacket(string json) {
Document document;
document.Parse(json.c_str());
if (document.HasMember("PressedKey")) {
int pressedKey = document["PressedKey"].GetInt();
ApplyReceivedInput(pressedKey);
}
}
void AUDPActor::ApplyReceivedInput(int number) {
switch (number)
{
case 100:
break;
case 0: //forward
myCharacter->AddMovementInput(FVector(10, 0, 0), 5.0);
break;
case 1: //backward
myCharacter->AddMovementInput(FVector(-10, 0, 0), 5.0);
break;
case 2: //left
myCharacter->AddMovementInput(FVector(0, -10, 10), 5.0);
break;
case 3: //right
myCharacter->AddMovementInput(FVector(0, 10, 0), 5.0);
break;
}
}
功能中的“向前”时,角色向前移动。但是,如果我按住键(“w”,那就是),角色不会移动。
当我通过在GUI上显示它来检查收到的JSON:void AUDPActor::ApplyReceivedInput(int number)
时:FString message = StringFromBinaryArray(packetData);
,我注意到了一堆“???????????”我的JSON消息结束......
看一下这张图片:
在右侧(客户端),您可以看到正在发送的消息(JSON)。 “PressedKey”:0表示按“w”并简单地表示......向前走。
现在,在左侧,您有服务器应用程序(UE4),它显示收到的消息。一切顺利,如果我只是点击按键,但按住它们导致奇怪的线路???????可以在上面的图片中看到。
可能是什么原因?
更新
我刚才有一个想法。令人惊讶,我知道,但缓冲区是否可能充满了垃圾?换句话说,也许我的缓冲区大小为100,而我的数据实际上只有30个字节。那么,缓冲区不会包含来自UDP数据包的一些垃圾吗?显然,我不熟悉网络编程,但我想知道我是否需要“刷新”我的套接字或类似的东西。
无论如何,我还没有在这个问题上取得任何进展。