2014-04-22 30 views
1

我正在使用DatagramSocket来接收DatagramPacket,就像s.receive(p)一样,我正在循环执行此操作。然而,我发现了两个意想不到的行为。DatagramPacket getData vs getLength

1)即使数据包只能包含10或20个字节,getData()(打字机为getBytes)总是返回500字节(我设置的字节缓冲区)。我应该修剪这个还是有一个更清晰的方法来处理这个问题?

和真正的问题...

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
  1. 没有getBytes()方法。
  2. 的getData()方法总是返回你初始化它的字节数组。
  3. 内部长度始终更新为接收数据包的实际长度。
  4. 与您的断言相反,内部字节数组永远不会增长以适应更大的数据包。

其中一个后果是,如果你一直收到同一个DatagramSocket,它的长度会不断缩小到目前为止收到的最小数据报的长度。所以你必须至少在每次接收之前将长度重置为字节数组的长度。

+0

我的意思是,如果我发送123将接收并说我的长度为3,如果我送1234它将接收和说我的长度为4,将保持增长和更新的getData但当时如果我送5它会说长度是1,但不会更新getData。我对此不清楚吗?这就是我越来越容纳更大的数据包的意思。我不是说比缓冲区大。 – CodeCamper

+0

不会。它不会“持续增长”。长度将保持*缩小,*正如我在最后一段所述。我对此不清楚吗?如果您收到的数据包的长度已被先前接收设置为1,您将收到一个字节,剩下的部分将被丢弃。这就是为什么你必须不断重置长度。 – EJP

+0

发送#1:A, 收到#1:长度1, 接收#1:A, 发送#2:AB, 收到#2:长度2, 收到#2:AB, 发送#3:ABC , 收到#3:长度3, 收到#3:ABC, 发送#4:1, 收到#4:长度1, 收到#4:1BC, – CodeCamper