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 回答