Java DatagramPacket getData vs getLength

Java DatagramPacket getData vs getLength,java,networking,Java,Networking,我使用一个DatagramSocket来接收一个DatagramPacket像这样的s.receive(p),我在循环中这样做。然而,我发现了两种意想不到的行为 1) getData()(typo是getBytes)始终返回500字节(我设置的字节缓冲区),即使数据包可能只包含10或20个字节。我应该修剪一下还是有更干净的方法处理 而真正的问题 2) getLength()始终为每个新数据包更新,但getBytes()仅在下一个数据包大于上一个数据包时更新。。。这是DatagramPacket类

我使用一个
DatagramSocket
来接收一个
DatagramPacket
像这样的
s.receive(p)
,我在循环中这样做。然而,我发现了两种意想不到的行为

1)
getData()
(typo是getBytes)始终返回500字节(我设置的字节缓冲区),即使数据包可能只包含10或20个字节。我应该修剪一下还是有更干净的方法处理

而真正的问题

2) getLength()始终为每个新数据包更新,但getBytes()仅在下一个数据包大于上一个数据包时更新。。。这是DatagramPacket类中的一个小故障还是有人愿意向我解释的某个特性

我现在能想到的唯一解决方案就是为每个接收创建一个新的
数据包
,但为什么它要更新
长度
,而不是
字节
(除非它在字节大于前一个包时会更新字节)

编辑:我似乎已经解决了这个问题,下面是我的代码,每个请求都会自动动态更新数据包

s= new DatagramSocket(port, InetAddress.getByName("0.0.0.0"));
p= new DatagramPacket(new byte[500], 500);
然后我在下面循环这个代码

s.receive(p);
System.out.println("Port: " + p.getPort() + "\nLength: " + p.getLength() + "\nReceived: " + new String(p.getData(), p.getOffset(), p.getLength()) + "\n from: " + p.getAddress().toString());
  • 没有getBytes()方法
  • getData()方法始终返回初始化它时使用的字节数组
  • 内部长度始终更新为接收到的数据包的实际长度
  • 与您的断言相反,内部字节数组永远不会增长以容纳更大的数据包

  • 结果之一是,如果您继续接收相同的DatagramSocket,它的长度将一直缩小到目前为止接收到的最小数据报的大小。因此,在每次接收之前,您必须至少将长度重置为字节数组的长度。

    我的意思是,如果我发送123,它将接收,并说我的长度为3,如果我发送1234,它将接收并说我的长度为4,它将继续增长并更新getData,但如果我发送5,它将说长度为1,但它不会更新getData。我不清楚吗?这就是我所说的增长以适应更大的数据包的意思。我不是说比缓冲区大,不是。它不会“继续成长”。正如我在最后一段中所描述的,长度将不断缩短。我对这件事还不清楚吗?如果您在一个DatagramPacket中接收到任何内容,该数据包的长度已被先前的接收设置为1,那么您将收到其中的一个字节,其余的将被丢弃。这就是为什么您必须不断重置长度。发送1:A,接收1:1,接收1:A,发送2:AB,接收2:2,接收2:2,接收2:AB,发送3:ABC,接收3:ABC,接收3:ABC,发送4:1,接收4:1,接收4:1BC,只是因为打印数据时忽略了长度,因此,您正在打印以前收到的数据报中的数据。第四个数据包中的“BC”未受第三个数据包的干扰。请尝试“新建字符串(packet.getData()、packet.getOffset()、packet.getLength())。@codecamp如果有新问题,请提出新问题。不要在这里随意提问,在评论中回答不同的问题。没有人会找到它。我有一年没找到它了。这不是一个论坛。