【问题标题】:DatagramPacket getData vs getLengthDatagramPacket getData 与 getLength
【发布时间】:2014-04-22 18:35:45
【问题描述】:

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

1) getData()(typo was 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());

【问题讨论】:

    标签: java networking


    【解决方案1】:
    1. 没有 getBytes() 方法。
    2. getData() 方法总是返回你初始化它的字节数组。
    3. 内部长度始终更新为收到的数据包的实际长度。
    4. 与您的断言相反,内部字节数组永远不会增长以容纳更大的数据包。

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

    【讨论】:

    • 我的意思是,如果我发送 123 它会收到并说我的长度是 3,如果我发送 1234 它会收到并说我的长度是 4 它会继续增长并更新 getData 但是如果我发送一个 5,它会说长度为 1,但它不会更新 getData。我对此不清楚吗?这就是我所说的增长以容纳更大的数据包的意思。我的意思不是比缓冲区大。
    • 没有。它不会“继续增长”。正如我在上一段中所述,长度将保持缩小,。我对此不清楚吗?如果您在 DatagramPacket 中接收到任何长度已被先前接收设置为 1 的内容,您将收到其中的一个字节,其余的将被丢弃。这就是为什么你必须不断重置长度。
    • 发送#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 这只是因为您在打印数据时忽略了长度,所以您正在从以前收到的数据报中打印数据。第四个数据包中的“BC”不受第三个数据包的干扰。试试'new String(packet.getData(), packet.getOffset(), packet.getLength())'。
    • @CodeCamper 如果您有新问题,请提出新问题。不要在这里问随机问题,在 cmets 中回答不同问题。没有人会找到它。 一年没找到。这不是论坛。
    猜你喜欢
    • 2017-03-25
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多