DatagramPacket类中,所有构造函数都需要一个int参数作为“ length”。
为什么我尝试接收DatagramPacket时需要设置其长度,因为我不一定知道该包有多长?
我应该将其设置为哪个数字?

编辑:
让我将我的问题更改为:

如果DatagramSocket.receive方法具有签名

public DatagramPacket receive() {};


代替

public void receive(Datagrampacket p) {};


会更有意义吗?就像说的那样,接收方通常不知道数据包的外观。

由于交付服务类比通常应用于UDP,因此可以这样说:

DatagramSocket就像一个邮箱。 DatagramPacket就像包裹信封。 DatagramPacket.data是信封内的内容。对于递送服务,接收方提供邮箱,但不提供信封。

最佳答案

好吧,您要让它写入您还提供的字节数组。因此,请确保您的字节数组与您希望处理的最大数据包一样大,并为length参数传入数组的长度。

编辑:对于已编辑的问题,该API表示接收代码每次必须创建一个新的缓冲区。使用现有的API,同一个字节数组可用于多次调用,因为调用者可以决定何时使用完它。

现在承认,这样的重载是有意义的:

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


...但是那是另一回事。

09-09 20:45