奇怪'??????'通过UDP从JSON反序列化时收到

时间:2015-12-25 23:48:51

标签: c++ json udp unreal-engine4

我有一个客户端应用程序,通过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消息结束......

看一下这张图片:

enter image description here

在右侧(客户端),您可以看到正在发送的消息(JSON)。 “PressedKey”:0表示按“w”并简单地表示......向前走。

现在,在左侧,您有服务器应用程序(UE4),它显示收到的消息。一切顺利,如果我只是点击按键,但按住它们导致奇怪的线路???????可以在上面的图片中看到。

可能是什么原因?

更新

我刚才有一个想法。令人惊讶,我知道,但缓冲区是否可能充满了垃圾?换句话说,也许我的缓冲区大小为100,而我的数据实际上只有30个字节。那么,缓冲区不会包含来自UDP数据包的一些垃圾吗?显然,我不熟悉网络编程,但我想知道我是否需要“刷新”我的套接字或类似的东西。

无论如何,我还没有在这个问题上取得任何进展。

0 个答案:

没有答案