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

标签 java sockets networking udp

这是我上一个问题的后续问题: Java UDP send - receive packet one by one

正如我在那里指出的那样,基本上,我想通过 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() 返回接收到的数据报中的实际字节数。因此,您只需使用 buffer[] 从索引 0 到索引 packet.getLength()-1。

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

关于java - Java UDP中如何获取实际数据包大小 `byte[]`数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868956/

相关文章:

java - 仅检索目录和子目录中的txt文件

java - Android 蓝牙广播接收器未接收

c++ - 检查 basic_socket_acceptor 是否准备好接受

c# - 在某个端口上查找传出连接的 IP 地址

java - 使用 Proguard 混淆 Android 应用程序与 Dropbox.com 库

java - 如何使轴的像素大小相等?

python - 在运行的进程中刷新paramiko中的stdout

java - 为什么会出现此错误 :java.net.PlainSocketImpl.checkNotClosed(PlainSocketImpl.java :116)?

java - JPQL时间间隔

macos - 重启 mosquitto 代理