DatagramPacket - getData 是不是总是返回传递的相同缓冲区?

Posted

技术标签:

【中文标题】DatagramPacket - getData 是不是总是返回传递的相同缓冲区?【英文标题】:DatagramPacket - will getData always return the same buffer which is passed?DatagramPacket - getData 是否总是返回传递的相同缓冲区? 【发布时间】:2016-09-30 07:27:29 【问题描述】:
byte [] r = new byte[4096];
DatagramPacket dpr = new DatagramPacket(r, r.length);
sock.receive(dpr);

receive 之后,dpr.getData()r 会一直保持不变吗?

例如:我可以直接使用字节数组r 还是需要调用getData() 再次检索缓冲区?

测试它,显示它是相同的,但这总是保证吗?

【问题讨论】:

【参考方案1】:
byte [] r = new byte[4096];
DatagramPacket dpr = new DatagramPacket(r, r.length);
sock.receive(r);

应该是sock.receive(dpr);

receive之后dpr.getData() & r会一直一样吗?

是的。 r 作为“保存传入数据报的缓冲区”提供给构造函数,getData()“返回用于接收或发送数据的缓冲区”。

即我可以直接使用字节数组 r 还是需要调用 getData() 再次检索缓冲区?

你可以使用字节数组,但为什么呢?像其他人一样使用getData(),不要忘记也使用getOffset()getLength(),而不是假设数据报填充了字节数组:例如System.out.println(new String(datagram.getData(), datagram.getOffset(), datagram.getLength()));

【讨论】:

为什么 getOffset 永远不是 0? 在您的情况下它将为 0,但还有其他构造函数,其中字节数组与偏移量一起传递。在这种情况下,将使用构造函数中给出的偏移量。如果将来有人更改对构造函数的调用,您应该调用 getOffset 以保护您的代码免受令人讨厌的意外。

以上是关于DatagramPacket - getData 是不是总是返回传递的相同缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

java 网络编程-UDP基本类型传输(intbooleanstring)

如何快速制作 DatagramPacket 代码?

UDP中使用的DatagramPacket

Java中的DatagramPacket与DatagramSocket的初步

Java,DatagramPacket接收,如何判断本地ip接口

试着用java实现DNS——DatagramSocket, DatagramPacket, Message