2017-01-14 14 views
0

私はマルチプレイヤーゲームをプログラミングしていますが、私はudpパケットのサイズに苦労しています。私はudpパケットを介して複数の敵の統計情報(hp、位置、id)を送信したい。ここで重要なコード部分です:あなたが見ることができるように、私はそれを送信する前に、[]のバイトに、それを変換した後の文字列にすべてのデータをマージしていますUDPパケット:1つのパケットに異なるデータ型を送信するには?

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

。しかし、charは、小さなint(idとposition)とlongs(hp)よりも多くのバイトを消費します。 例:1匹の暴徒は2.000.000馬力です。その数は7文字(= 7バイト)を消費しますが、長い間は4バイトしか必要としません。オブジェクトストリームを使用せずに、より少ないバイト数でこのデータをすべて送信するにはどうすればよいですか?

私はいくつかの提案について非常に満足しています! ありがとうございます。

+0

個々のチャンクを文字列に変換するのではなく、バイトに変換してから、すべてを一度にバイトに変換しますか? – Natecat

+0

受信側でどのように解析するのですか?つまり、どのバイトの塊が何であるかをどのように知ることができるのでしょうか。私は1バイトの[]メッシュだけを受け取るので、 – Madness

+1

あなたができるいくつかのことがあります。標準的な長さのパケットを作成して、バイト配列内の位置の範囲が一貫して特定の変数に対応するようにするか、各変数の開始位置を示すバイトを配列に追加することができます。 – Natecat

答えて

0

まず、データが1つのパケットに収まるだけの小ささであれば、UDPメッセージの長さはそれほど大きな違いはありません。パケットサイズが重大な問題であるという具体的な証拠がない限り、問題に汗を流さないことをお勧めします。ハードベンチマークの結果では、一定のパケットサイズを超えるゲームで必要とされる最小伝送速度を維持できないことが示されます。

メッセージの長さが気になる場合は、文字列のエンコーディング(上記のように)とバイナリエンコーディングを使用して比較する必要がありますが、実際には問題はありません。例えばあなたはDataInputStreamDataOutputStreamを使用するようになります。

  • byte
  • short又はcharは2つのオクテット

として符号化される単一のオクテットとして符号化される詳細DataOutputStreamjavadocsを参照してください。

オブジェクトストリームを使用しないでください。これらは、DataOutputStreamと同じバイナリエンコーディングを使用しますが、タイプ情報とオブジェクトIDのエンコードにはかなりのオーバーヘッドがあります。

+0

ありがとう! :)文字列エンコーディングからバイナリエンコーディングに移動しますが、それは私の懸念を解決するはずです! :) – Madness

+0

しかしまずあなたの心配が十分に確立されていることを確認してください。そうでなければ、あなたの変更はほとんど差をつけません。それは時間の無駄です。 –

+0

それはよく設立されました:) thx。 – Madness

0

私は今、私の試みをしていますが、それは文字列では動作しますが、長くない。私は自分自身で間違いを理解することはできません、あなたのmaybのeoneは、エラーを見つけることができますか?ここ は、それは:送信側

:受信側で

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されていませんなぜでしょうか?)

+0

DataOutputStream + ByteArrayOutputStreamなどを使用します。これは簡単です。 –

関連する問題