这是我之前的一个问题: 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数据包?
谢谢你的想法。
答案 0 :(得分:5)
你已经回答了自己的问题。 packet.getLength()
返回接收数据报中的实际字节数。因此,您只需使用索引buffer[]
中的0
来索引packet.getLength()-1.
请注意,这意味着如果您在循环中调用receive()
,则必须每次在循环周围重新创建DatagramPacket
,或者在接收之前将其长度重置为最大值。否则getLength()
会缩小到目前为止收到的最小数据报的大小。
答案 1 :(得分: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()//...........
//...........