zoukankan      html  css  js  c++  java
  • org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.BufferOverflowException解决

     先连续发几十个很小很小的包(<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没释放导致该问题的解决在此不赘述。


  • 相关阅读:
    MOF编译器无法连接VMI服务器。原因可能是语义错误的解决方案
    【原】Sql Server 2008---安装时卸载Visual Studio
    SQL SERVER 删除前判断指定的表或者存储过程是否存在
    NPOI 表头、页眉页脚重复设置
    在vs2010中显示代码的行数
    【summary】JQuery 相关css、ajax、数据操作函数或方法
    CSS自适应的占位符效果
    NPOI 生成 excel基本设置
    JavaSE——转换流和缓冲流
    javaSE——字符流
  • 原文地址:https://www.cnblogs.com/blogyuan/p/3739654.html
Copyright © 2011-2022 走看看