gpt4 book ai didi

java - DatagramPacket getData 与 getLength

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:45 27 4
gpt4 key购买 nike

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

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

真正的问题...

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

后果之一是,如果您继续接收到同一个 DatagramSocket,它的长度会不断缩小到迄今为止接收到的最小数据报的大小。因此,您必须在每次接收之前至少将长度重置为字节数组的长度。

关于java - DatagramPacket getData 与 getLength,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com