DatagramPacket getData vs getLength

时间:2014-04-22 18:35:45

标签: java networking

我正在使用DatagramSocket来接收DatagramPacket这样的s.receive(p),我正在循环中这样做。然而,我发现了两种无意识的行为。

1)getData()(拼写错误为getBytes)总是返回500个字节(我设置的字节缓冲区),即使数据包可能只包含10个或20个字节。我应该修剪一下还是有更清洁的方法来处理它?<​​/ p>

和真正的问题......

2)getLength()总是针对每个新数据包进行更新,但getBytes()仅在下一个数据包大于前一个数据包时更新...这是DatagramPacket类中的一个小故障还是某个特性会照顾给我解释......?

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

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

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());

1 个答案:

答案 0 :(得分:1)

  1. 没有getBytes()方法。
  2. getData()方法始终返回使用它初始化的字节数组。
  3. 内部长度始终更新为收到的数据包的实际长度。
  4. 内部字节数组从不增长以容纳更大的数据包,这与你的断言相反。
  5. 其中一个后果是,如果你继续接收相同的DatagramSocket,它的长度会缩小到目前为止收到的最小数据报的大小。因此,在每次接收之前,您必须至少将长度重置为字节数组的长度。