如何处理 UDP 数据传输中的数据格式
how to handle format of the Data in a UDP data Transfer
我正在制作一个原型 MMORPG 游戏,我看到最好使用 UDP 来传输玩家动作。所以我必须转移玩家的 X,Y 对吧?那么如何管理连接的数据包丢弃(如果有)。
谁能给我解释一下这个 UDP 的工作方式,我如何管理我传输的数据的格式。如果有任何数据包丢失会导致格式无用,对吗?
UDP 是无连接的。每个数据报都是单独单独处理的,一个数据报可能只作为一个整体丢失,也可能根本不丢失。
因此解决您的问题的方法是确保单个数据报包含所需的所有信息。
例如,假设您至少需要发送玩家 ID 以及 X 和 Y 坐标,您可以发送三个 int
值。
有很多方法可以构建数据报本身(作为 byte[]
发送),但最简单的方法之一是使用 BinaryWriter
:
byte[] BuildDatagram(int playerId, int x, int y)
{
using (MemoryStream stream = new MemoryStream)
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(playerId);
writer.Write(x);
writer.Write(y);
writer.Flush();
return stream.ToArray();
}
}
请注意,UDP 合理用于播放器位置的原因是,如果偶尔丢失数据报,问题不大。同样,多次接收同一个数据报通常也不是什么大问题。最后,以不同于发送数据报的顺序接收数据报并不是 太大 大问题(尽管玩家会发现 UDP 可能导致的三个可能问题中最烦人的问题).
您只想对这种数据使用 UDP。任何你想要可靠发送的东西,你要么需要在你的 UDP 实现中添加代码以确保可靠性(这相当复杂,特别是对于一般不熟悉网络编程的人来说),要么你会想为那些使用 TCP数据种类。
我正在制作一个原型 MMORPG 游戏,我看到最好使用 UDP 来传输玩家动作。所以我必须转移玩家的 X,Y 对吧?那么如何管理连接的数据包丢弃(如果有)。
谁能给我解释一下这个 UDP 的工作方式,我如何管理我传输的数据的格式。如果有任何数据包丢失会导致格式无用,对吗?
UDP 是无连接的。每个数据报都是单独单独处理的,一个数据报可能只作为一个整体丢失,也可能根本不丢失。
因此解决您的问题的方法是确保单个数据报包含所需的所有信息。
例如,假设您至少需要发送玩家 ID 以及 X 和 Y 坐标,您可以发送三个 int
值。
有很多方法可以构建数据报本身(作为 byte[]
发送),但最简单的方法之一是使用 BinaryWriter
:
byte[] BuildDatagram(int playerId, int x, int y)
{
using (MemoryStream stream = new MemoryStream)
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(playerId);
writer.Write(x);
writer.Write(y);
writer.Flush();
return stream.ToArray();
}
}
请注意,UDP 合理用于播放器位置的原因是,如果偶尔丢失数据报,问题不大。同样,多次接收同一个数据报通常也不是什么大问题。最后,以不同于发送数据报的顺序接收数据报并不是 太大 大问题(尽管玩家会发现 UDP 可能导致的三个可能问题中最烦人的问题).
您只想对这种数据使用 UDP。任何你想要可靠发送的东西,你要么需要在你的 UDP 实现中添加代码以确保可靠性(这相当复杂,特别是对于一般不熟悉网络编程的人来说),要么你会想为那些使用 TCP数据种类。