我是靠谱客的博主 欣慰可乐,最近开发中收集的这篇文章主要介绍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字节数据的全部内容,希望文章能够帮你解决netty udp接收超过2048字节数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部