如何在Java UDP中获取实际的包大小`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"); 

这里,实际的数据包大小是300字节,但buffer1被分配为1024字节,对我来说,处理buffer1是错误的。

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

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

有没有办法不预先分配缓冲区大小并直接接收UDP数据包?

谢谢你的想法。

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

请注意,这意味着如果您在循环中调用receive() ,则必须每次在循环周围重新创建DatagramPacket ,或者在接收之前将其长度重置为最大值。 否则getLength()会缩小到目前为止收到的最小数据报的大小。

自我回答。 我做了如下:

 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()//........... //...........