我正在使用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());
答案 0 :(得分:1)
其中一个后果是,如果你继续接收相同的DatagramSocket,它的长度会缩小到目前为止收到的最小数据报的大小。因此,在每次接收之前,您必须至少将长度重置为字节数组的长度。