发布
社区首页 >问答首页 >UDP数据包:如何在一个数据包中发送不同的数据类型?

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

Stack Overflow用户
提问于 2017-01-14 08:34:38
回答 2查看 246关注 0票数 0

我正在编写一个多人游戏,我有一个udp数据包的大小的困难时期。我想通过udp数据包发送多个敌人的统计信息(hp,position,id)。以下是重要的代码部分:

代码语言:javascript
代码运行次数:0
复制
Byte[] datagramPacketData = ("11" + String.valueOf(entityAmount) + "," + gamename + "," + username + entitiesToBeSent).getBytes();

如您所见,我将所有数据合并到一个字符串中,然后在发送之前将其转换为byte[]。但是,与小int( id和position)和long(Hp)相比,chars消耗更多的字节。例如:一个暴徒有2.000.000马力。这个数字将占用7个字符(=7个字节),但它只需要4个字节。如何在不使用对象流的情况下,使用更少的字节来发送所有这些数据?

如果有一些建议,我会很高兴的!非常提前感谢您。

EN

回答 2

Stack Overflow用户

发布于 2017-01-14 08:50:57

首先,如果您的数据足够小,可以放入一个数据包中,那么UDP消息长度不太可能产生太大的差异。我建议你不要在这个问题上出汗,除非你有确凿的证据证明数据包大小是一个关键问题;即,硬基准测试结果表明,你将无法维持游戏所需的最低传输速率超过一定的数据包大小。(针对实际不存在的问题进行优化是浪费精力。)

如果你关心消息长度,那么你应该使用字符串编码(如上所述)和二进制编码进行比较;例如,就像使用DataInputStreamDataOutputStream一样。

  • a byte将编码为单个八位字节
  • a short or char将编码为两个八位字节

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

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

票数 0
EN

Stack Overflow用户

发布于 2017-01-14 09:40:05

我现在已经尝试过了,它对String有效,但不是long或long。我自己找不出这个错误,你们谁能找出错误吗?这就是它:

在发送方:

代码语言:javascript
代码运行次数:0
复制
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++;
        }

在接收方:

代码语言:javascript
代码运行次数:0
复制
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,但为什么呢?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41645508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档