在DatagramPacket
类中,所有构造函数都需要一个int参数作为“length”。
当我尝试接收它时,为什么需要设置DatagramPacket
的长度,因为我不一定知道数据包有多长?
我应该将它设置为哪个数字?
编辑: 让我改变我的问题:
如果DatagramSocket.receive
方法有签名
public DatagramPacket receive() {};
而不是
public void receive(Datagrampacket p) {};
不是更有意义吗?如上所述,接收器通常不知道数据包是什么样的。
由于传递服务类比通常应用于UDP,所以我们说:
DatagramSocket就像一个邮箱。 DatagramPacket就像包裹信封一样。 DatagramPacket.data是信封内的内容。对于送货服务,接收器提供邮箱而不是信封。
答案 0 :(得分:1)
好吧,你要求它写入一个你也提供的字节数组。因此,请确保您的字节数组与您希望处理的最大数据包一样大,并传入length
参数的数组长度。
编辑:对于编辑过的问题,该API意味着接收代码每次都必须创建一个新的缓冲区。使用现有的API,相同的字节数组可用于多个调用,因为调用者可以决定何时使用它。
现在可以肯定的是,这样的过载是有道理的:
public DatagramPacket(byte[] buffer)
{
this(buffer, buffer.length);
}
......但那是另一回事。