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)
Java中的DatagramPacket与DatagramSocket的初步