簡體   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