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数据长度的报文了。  

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值