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

2022-09-04 03:53:03

这是我上一个问题的后续问题: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字节,但被分配为1024字节,对我来说,处理起来有问题。buffer1buffer1

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

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

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

感谢您的想法。


答案 1

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

请注意,这意味着,如果在循环中调用,则必须在循环期间每次重新创建 ,或者将其长度重置为接收前的最大值。否则,将一直缩小到迄今为止收到的最小数据报的大小。receive()DatagramPacketgetLength()


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

推荐