[英]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消息的长度不太可能有很大的不同。 除非有确凿的证据表明数据包大小是一个关键问题,否则我建议您不要着急。 即硬性基准测试结果,表明您将无法在特定数据包大小以上维持游戏所需的最小传输速率。 (针对实际上不存在的问题进行优化是浪费精力。)
如果您担心消息的长度,则应该使用字符串编码(如上所述)和二进制编码进行比较; 例如,就像使用DataInputStream
和DataOutputStream
。
byte
将被编码为一个八位字节 short
或char
将被编码为两个八位字节 有关详细信息,请参见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.