有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何处理UDP数据传输中的数据格式

我正在制作一个MMORPG原型游戏,我读到最好使用UDP传输玩家的动作。所以我必须转移球员的X,Y,对吗?那么,我如何管理连接的数据包丢弃(如果有的话)

有人能给我解释一下UDP的工作方式吗?我该如何管理我传输的数据的格式。如果任何数据包丢失,会导致格式无效,对吗


共 (1) 个答案

  1. # 1 楼答案

    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