netty udp接收超过2048字节数据
? ? 默認netty udp接收DatagramPacket字節數最大是2048,如果數據大,超過這個限制,就會報錯,拋出異常,雖然這個包解析失敗,不會影響其他包的解析,但是總得來說,這種失敗是不利于數據收集的。
? ? 我們先來看看這個錯誤:
? ??java.lang.IndexOutOfBoundsException: readerIndex(57) + length(2503) exceeds writerIndex(2048): PooledUnsafeDirectByteBuf(ridx: 57, widx: 2048, cap: 2048)
? ? 報錯代碼出自AbstractByteBuf.java的checkReadableBytes0()這個方法:
? ? ?
? ? 通過調試,我們可以看到(DatagramPacket?msg) 默認writerIndex=2048:
? ??
? ? 報錯的原因就是讀取的數據索引readerIndex超過writerIndex,解決辦法就是在udp服務創建的時候,指定RCVBUF_ALLOCATOR,如下所示:
EventLoopGroup group = new NioEventLoopGroup(threadNum); try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true).option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535)).handler(new UdpDataHandler(businessSender));ChannelFuture future = bootstrap.bind(port).sync();future.channel().closeFuture().await(); } finally {group.shutdownGracefully(); }? ?關鍵的一句代碼就是:.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535))?
? ? 經過這個改進,udp可以接收超過2048數據長度的報文了。??
總結
以上是生活随笔為你收集整理的netty udp接收超过2048字节数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网导论期末试题
- 下一篇: Matlab中如何使函数作为参数传递