如何在Java UDP中获取实际的数据包大小`byte []`数组

13 java sockets networking udp

这是我上一个问题的后续问题: 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");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢你的想法.

use*_*421 6

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

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