Adjusted frame length exceeds 4096: 5637 - discarded 服務端解決


解決服務端Adjusted frame length exceeds 4096: 5637 - discarded問題
1. 具體錯誤
2. 錯誤原因
2.1 長度格式問題
2.2 長度大小問題
3. 解決方法
1. 具體錯誤
下面展示一些 錯誤詳情。

io.netty.handler.codec.TooLongFrameException: Adjusted frame length exceeds 4096: 18247 - discarded
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.fail(LengthFieldBasedFrameDecoder.java:503)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.failIfNecessary(LengthFieldBasedFrameDecoder.java:489)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.exceededFrameLength(LengthFieldBasedFrameDecoder.java:376)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:419)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:332)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:498)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:437)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)

2. 錯誤原因
2.1 長度格式問題
netty自帶的LengthFieldBasedFrameDecodr長度編碼協議,長度偏移取值必須為16進制表示。

new LengthFieldBasedFrameDecoder(4*1024,0,2);
// 長度位:000C 表示 12 長度
// eg:000C321453215435413415206753 (byte[]轉16進制表示)

2.2 長度大小問題
調整后的幀長度超過4096:18247-已丟棄。本人在netty服務端對數據包進行處理時,使用了LengthFieldBasedFrameDecodr長度協議解碼器。部分代碼如下:

@Override
public void initChannel(SocketChannel ch) {
//長度協議的解碼器
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(4*1024,0,2));
ch.pipeline().addLast(new SocketServerHandler());//控制類
}

而長度協議定一個最大可接收長度為4*1024 = 4096。故服務端接收超過4096個字節之后,服務端當做垃圾包丟棄了。

3. 解決方法
把netty服務端的長度協議的解碼器最大可接收長度根據需求更改到足夠長即可。

new LengthFieldBasedFrameDecoder(20*1024,0,2);
————————————

版權聲明:本文為CSDN博主「大碼的」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44055686/article/details/105945925


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM