博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.BufferOverflowException解决
阅读量:5129 次
发布时间:2019-06-13

本文共 2363 字,大约阅读时间需要 7 分钟。

 先连续发几十个很小很小的包(<10 byte) 再突然发一个大小64byte的包 这时你会发现mina就会出现以下错误使用mina处理大数据接收时:

org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.BufferOverflowException (Hexdump: 53 53 00 04)

at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:242)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:710)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.nio.BufferOverflowException
at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:182)
at org.apache.mina.core.buffer.AbstractIoBuffer.put(AbstractIoBuffer.java:625)
at org.apache.mina.core.buffer.AbstractIoBuffer.put(AbstractIoBuffer.java:1329)

经过对mina的分析,这是由对包长度不对做成的(即,我们发的包长是大于64byte的,但他的byteBuffer大小只有64byte,当我们尝试读取第65个byte就会出现这个错误);

解决方法:

acceptor.getSessionConfig().setReadBufferSize(1024*1024);//发送缓冲区1M

acceptor.getSessionConfig().setReceiveBufferSize(1024*1024);//接收缓冲区1M

实际应用中根据业务数据包设置合理大小就可以了。

另外:buff在解析完毕没有释放也会导致上述问题,因buff没释放导致该问题的解决在此不赘述。

转载于:https://www.cnblogs.com/blogyuan/p/3739654.html

你可能感兴趣的文章
利用vcard和qrcode.js生成二维码导入联系人
查看>>
ASP.NET SessionState 解惑
查看>>
find 命令
查看>>
diy操作系统 0:万事开头难
查看>>
正则表达式------捕获性分组,非捕获性分组,前瞻,后瞻
查看>>
HTML颜色名
查看>>
Objective中的协议(Protocol)
查看>>
Windows8 激活.Net3.5
查看>>
验证手机号/邮箱是否合法
查看>>
WPF Application添加全局异常处理
查看>>
5月1日学习收获
查看>>
linux常用查看命令
查看>>
交叉工具链和makefile
查看>>
Bss段的作用及初始化
查看>>
数的全排列 dfs深度优先搜索
查看>>
逻辑卷管理
查看>>
纯CSS垂直居中的四种解决方案
查看>>
TCP之半关闭与CLOSE_WAIT
查看>>
Java、Tomcat 及 MySQL 环境配置
查看>>
POJ-3468-A Simple Problem with Integers(区间更新,求和)-splay或线段树
查看>>