3

我正在构建一个基于 UDP 的应用程序来接收和发送多个数据包。

我可以为每次发送构建一个新DatagramPacket实例,或者在我的应用程序生命周期内回收一个实例。

  • 重用 a 有什么好处DatagramPacket吗?(例如内存分配)
  • 有没有潜在的问题?(例如线程安全)
4

1 回答 1

2

看起来你不能。我只是尝试发送相同的DatagramPacket两次,我得到以下行为:

  • 数据包只发送一次
  • Netty 在下面记录警告

因此,DatagramPacket您可以重用传递给DatagramPacket构造函数的参数,主要是缓冲区,而不是重用 。

2018-10-18 09:29:11.103 WARN 5468 --- [nioEventLoopGroup-2-1] incAbstractChannelHandlerContext:无法将承诺标记为失败,因为它已经失败:DefaultChannelPromise@748a9b0e(失败:java.lang.IndexOutOfBoundsException:srcIndex : 0),未通知原因:java.lang.IndexOutOfBoundsException: srcIndex: 0 at io.netty.buffer.UnsafeByteBufUtil.setBytes(UnsafeByteBufUtil.java:519) at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:260)在 io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1080) 在 io.netty.channel.nio.AbstractNioChannel.newDirectBuffer(AbstractNioChannel.java:481) 在 io.netty.channel.socket.nio.NioDatagramChannel.filterOutboundMessage (NioDatagramChannel.java:308) 在 io.netty.channel。AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:877) at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1391) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) at io .netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) 在 io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) 在 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java: 1081) 在 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask 的 io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128)。在 io.netty.util.concurrent.SingleThreadEventExecutor.runAllTask​​s(SingleThreadEventExecutor.java:404) 在 io.netty.util.concurrent.SingleThreadEventExecutor.runAllTask​​s(SingleThreadEventExecutor.java:404) 在 io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) 运行(AbstractChannelHandlerContext.java:1070) .channel.nio.NioEventLoop.run(NioEventLoop.java:446) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable. java:30) 在 java.lang.Thread.run(Thread.java:748)NioEventLoop.run(NioEventLoop.java:446) 在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) 在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在java.lang.Thread.run(Thread.java:748)NioEventLoop.run(NioEventLoop.java:446) 在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) 在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在java.lang.Thread.run(Thread.java:748)

io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1 at io.netty.buffer.AbstractReferenceCountedByteBuf.release0(AbstractReferenceCountedByteBuf.java:100) ~[netty-buffer-4.1.29.Final.jar!/:4.1. 29.Final] 在 io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:84) ~[netty-buffer-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.util。 ReferenceCountUtil.release(ReferenceCountUtil.java:88) ~[netty-common-4.1.29.Final.jar!/:4.1.29.Final] at io.netty.channel.DefaultAddressedEnvelope.release(DefaultAddressedEnvelope.java:101) ~ [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:88) ~[netty-common-4.1.29.Final. jar!/:4.1.29.Final] 在 io.netty.channel。AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:884) ~[netty-transport-4.1.29.Final.jar!/:4.1.29.Final] at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java :1391) ~[netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) [netty-transport-4.1.29 .Final.jar!/:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final ] 在 io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask .在 io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128) [netty -transport-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1070) [netty-transport-4.1.29.Final.jar !/:4.1.29.Final] 在 io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 在io.netty.util.concurrent.SingleThreadEventExecutor.runAllTask​​s(SingleThreadEventExecutor.java:404) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop。运行(NioEventLoop.java:446)[netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar!/:4.1 .29.Final] 在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 在 java.lang。 Thread.run(Thread.java:748) [na:1.8.0_181]

于 2018-10-18T07:35:58.267 回答