2014-02-19 38 views
9

这是以后的问题我以前的一个: Java UDP send - receive packet one by one如何获取实际的数据包大小'的byte []`数组中的Java UDP

正如我指出在那里,基本上,我想接收数据包一个一个是通过UDP。

下面是一个例子代码:

ds = new DatagramSocket(localPort); 
byte[] buffer1 = new byte[1024]; 
DatagramPacket packet = new DatagramPacket(buffer1, buffer1.length); 

ds.receive(packet); 
Log.d("UDP-receiver", packet.getLength() 
          + " bytes of the actual packet received"); 

这里,将实际的数据包大小是说,300bytes,但buffer1被分配1024字节,而对我来说,这是什么毛病来处理buffer1

如何从这里获取实际包大小byte[]数组?

更重要的是,为什么我们需要预先分配缓冲区大小来接收Java中的UDP数据包? (node.js不这样做)

有什么办法不预先分配缓冲区大小,并直接接收UDP数据包,因为它是?

谢谢你的想法。

回答

4

您已回答了您的问题。 packet.getLength()返回接收到的数据报中的实际字节数。所以,你只需要使用buffer[]从指数0索引packet.getLength()-1.

注意,这意味着,如果你在一个循环中调用,你身边的每一次循环中重新创建DatagramPacket,或者其长度重置接收前的最大值。否则getLength()不断缩小到目前为止收到的最小数据报的大小。

+0

好的,谢谢EJP,我在这里发布我自己的答案。它似乎正在正确地查看我的日志。 –

2

自我回答。我做了如下:

int len = 1024; 
byte[] buffer2 = new byte[len]; 
DatagramPacket packet; 

byte[] data; 
while (isPlaying) 
{ 
    try 
    { 
     packet = new DatagramPacket(buffer2, len); 
     ds.receive(packet); 
     data = new byte[packet.getLength()]; 
     System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength()); 
     Log.d("UDPserver", data.length + " bytes received"); 
    } 
    catch()//........... 
//........... 
+2

这是毫无意义的。你已经有了一个包含数据的字节数组,并且你已经拥有了数据的长度,所以'Log.d(“UDPserver”,packet.length()+“bytes received”)'会起作用,已经发布在您的问题。不需要分配另一个数组并复制数据。 – EJP