2013-03-01 69 views
1

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

编辑: 让我改变我的问题是:

如果DatagramSocket.receive方法有签名

public DatagramPacket receive() {}; 

,而不是

public void receive(Datagrampacket p) {}; 

岂不更有意义?因为如上所述,接收者通常不知道分组是什么样的。

由于送货服务比喻往往是适用于UDP,让我们说:

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

+0

您的修改具有误导性。这个例子代替了“为什么我们需要在Datagrampacket中复制datagram.buffer.length和datagram.length?”为什么我们需要首先提供缓冲区。这是两个不同的问题。而且,现在还不清楚你现在要问什么。 – Val 2013-03-02 12:06:26

回答

1

那么,你问它写入一个字节数组,你提供。因此,请确保您的字节数组与您希望处理的最大数据包一样大,并传入参数length的数组长度。

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

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

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

...但是这是一个不同的问题。

+0

实际上这是个问题。为什么你应该在Java程序中提供数组的长度?奥卡姆的KISS原则是什么? – Val 2013-03-01 19:08:35

+0

@Val:它允许您为所有读取重复使用相同的缓冲区,这比每次创建新字节数组的接收代码更有效。它当然也可以模仿本地界面,当然...... – 2013-03-01 19:09:32

+0

不需要。缓冲区一次又一次地重复使用。提供长度不会使其更加可重用。 – Val 2013-03-01 19:11:27