繁体   English   中英

UDP数据包:如何在一个数据包中发送不同的数据类型?

[英]UDP packet: How to send different datatypes in one packet?

我正在编写一个多人游戏,而udp数据包的大小让我很难受。 我想通过udp数据包发送多个敌方状态(hp,位置,id)。 这是重要的代码部分:

Byte[] datagramPacketData = ("11" + String.valueOf(entityAmount) + "," + gamename + "," + username + entitiesToBeSent).getBytes();

如您所见,我将所有数据合并为一个String,然后在发送之前将其转换为byte []。 但是char消耗的字节要多于int(用于id和position)和longs(hp)的字节。 例如:一个暴民拥有2.000.000 hp。 该数字将消耗7个字符(= 7个字节),但长时间只需要4个字节。 我如何通过使用较少的字节而不使用对象流来发送所有这些数据?

对于某些建议,我将感到非常高兴! 提前非常感谢您。

首先,如果您的数据足够小以适合单个数据包,则UDP消息的长度不太可能有很大的不同。 除非有确凿的证据表明数据包大小是一个关键问题,否则我建议您不要着急。 即硬性基准测试结果,表明您将无法在特定数据包大小以上维持游戏所需的最小传输速率。 (针对实际上不存在的问题进行优化是浪费精力。)

如果您担心消息的长度,则应该使用字符串编码(如上所述)和二进制编码进行比较; 例如,就像使用DataInputStreamDataOutputStream

  • 一个byte将被编码为一个八位字节
  • shortchar将被编码为两个八位字节
  • 等等

有关详细信息,请参见DataOutputStream javadocs

不要使用对象流。 它们使用与DataOutputStream相同的二进制编码,但是对类型信息和对象标识进行编码会有很多额外的开销。

我已经尝试了一下,它适用于String,但效果不理想。 我无法独自找出错误,可能每个人都能找到错误? 就这个:

在发送方:

byte[] data = new byte[1024];
        int i = 0;

        String packetNumber = "25";

        ByteBuffer buffer0 = ByteBuffer.allocate(2);
        buffer0.put(packetNumber.getBytes());
        byte[] numberInByte = buffer0.array();

        int x = 0;
        for (int k = i; k < numberInByte.length; k++) {
            data[k] = numberInByte[x];
            x++;
            i++;
        }

        long life = 2000000;

        ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
        buffer.putLong(life);
        byte[] lifeInByte = buffer.array();

        x = 0;
        for (int k = i; k < lifeInByte.length; k++) {
            data[k] = lifeInByte[x];
            x++;
            i++;
        }

在接收方:

ByteBuffer byteBuffer = ByteBuffer.wrap(data);

        byte[] packetNumber = new byte[2];
        byteBuffer.get(packetNumber);
        System.out.println(new String(packetNumber));

        long life = byteBuffer.getLong();
        System.out.println(life);

输出为:25(是正确的)1966080(这不是2000000,但是为什么呢?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM