5

Javaでは、1文字は16ビット、2バイトです。つまり、UDPパケットをサーバーに送信する場合は、文字列の長さ(たとえば)を見つけて2を掛ける必要がありますか?

String string = "My awesome string!";
byte[] buff = new byte[ string.length*2 ];
buff = string.getBytes();
...
packet = new DatagramPacket(buff, buff.length, address, port);
socket.send(packet);

UDPパケット制限はどうですか?65kパケット。たとえば、データファイルをサーバーに送信する場合は、65/2kのデータを送信する必要があります。65を2に分割していますが、バフ制限はどのくらいですか?65/2または65kb?

例えば:

byte[] buff = new byte[ 65000 ]

//file and bufferreader handle
while( ( line = bufferedReader.readLine() ) != null ){
   buff = line.getBytes();
   packet = new DatagramPacket(buff, buff.length, address, port);
   socket.send(packet);
}

IPv4プロトコルは、受信者がパケットをマージするよりも自動的にパケットを分割するため、65kを超えるデータを送信できることをどこかで読みました。これは本当ですか?

バッファに空白が入るのはなぜですか?クライアントとサーバーアプリを作成しましたが、250サイズのバッファーを使用しています。たとえば、8バイトの長さの「Test」という単語を送信すると、「Test」という単語の後に非常に長い空白が表示されます。

byte[] buff = new byte[250];
packet = new DatagramPacket(buff, buff.length);
socket.receive(packet);
System.out.println("GET: " + buff);

そしてコンソールは言う:

GET:テスト..............................................。 ...............................。

(ドットは空白を表します)

4

2 に答える 2

8

つまり、UDPパケットをサーバーに送信する場合は、文字列の長さ(たとえば)を見つけて2を掛ける必要がありますか?

いいえString.getBytes()。適切な長さの適切な配列がすでに割り当てられています。

byte[] buff = string.getBytes();

次に、buff.length適切な長さを含みます。長さは、文字列をバイト配列に変換するために使用された文字セットに依存することに注意してください。

String.getBytes()ちなみに、パラメータなしはプラットフォームのデフォルトの文字セットを使用Stringしてバイト配列に変換するため、パラメータなしの使用は避けてください。エンコーディングを明示的に渡す方がよい:

byte[] buff = null;
try {
   buff = string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
   e.printStackTrace();
}

IPv4プロトコルは、受信者がパケットをマージするよりも自動的にパケットを分割するため、65kを超えるデータを送信できることをどこかで読みました。これは本当ですか?

TCPにも当てはまります。この場合、UDPではなくTCPを使用することをお勧めします。

于 2013-02-04T09:00:14.057 に答える
4

65kを超えるデータを送信できることをどこかで読んだことがあります

UDP経由ではありません。IPv4には65507バイトの絶対最大値があり、実際の制限は534バイトです。

IPv4プロトコルは、受信者がそれらをマージするよりも、パケットを自動的に分割するためです。これは本当ですか?

それは本当ですが、再構築の成功はTCPによってのみ保証され、UDPの上限は引き上げられません。

TCPを使用します。

于 2013-02-04T08:59:34.780 に答える