1

クラスではDatagramPacket、すべてのコンストラクターが「長さ」として int パラメーターを必要とします。DatagramPacketパケットの長さが必ずしもわからないのに、受信しようとするときにa の長さを設定する必要があるのはなぜですか? また、どの数値に設定すればよいですか?

編集:質問を次のように変更させてください:

DatagramSocket.receiveメソッドに署名がある場合

public DatagramPacket receive() {};

それ以外の

public void receive(Datagrampacket p) {};

それはもっと理にかなっていますか?前述のように、受信者は通常、パケットがどのように見えるかを知りません。

配送サービスの類推は UDP によく適用されるため、次のように言いましょう。

DatagramSocket はメールボックスのようなものです。DatagramPacket は小包の封筒のようなものです。DatagramPacket.data はエンベロープ内のコンテンツです。配送サービスの場合、受取人はメールボックスを提供しますが、封筒は提供しません。

4

1 に答える 1

1

さて、あなた提供しているバイト配列に書き込むように求めています。したがって、バイト配列が、処理すると予想される最大のパケットと同じ大きさであることを確認し、lengthパラメーターの配列の長さを渡します。

編集: 編集された質問の場合、その API は、受信コードが毎回新しいバッファーを作成する必要があることを意味します。既存の API では、同じバイト配列を複数の呼び出しに使用できます。これは、呼び出し元がいつ使用を終了するかを決定できるためです。

確かに、次のようなオーバーロードを持つことは理にかなっています。

public DatagramPacket(byte[] buffer)
{
    this(buffer, buffer.length);
}

…が、それは別問題です。

于 2013-03-01T18:49:28.160 に答える