概述
默认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字节数据的全部内容,希望文章能够帮你解决netty udp接收超过2048字节数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复