[英]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.