在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);
}
...但是那是另一回事。