关于mina的java.nio.BufferUnderflowException

在使用mina进行同步开发时遇到java.nio.BufferUnderflowException的问题。通过调整设置暂时解决了问题,但真正的解决方案在于正确使用CumulativeProtocolDecoder。CumulativeProtocolDecoder在doDecode方法返回true时会检查是否已消费数据,返回false则保留未读取的数据,等待下次合并解码。返回true的关键在于确认数据已足够解码。
摘要由CSDN通过智能技术生成

最近在使用mina做一个同步,在开发调试过程中总是会出现java.nio.BufferUnderflowException 确实是很郁闷啊,没办法,百度一下,一开始看到这篇文章http://my.oschina.net/javagg/blog/2,但是发现和我情况是不一样的,我是每个数据包几乎大小不会相差很大。那么还有什么问题呢?



接着找,发现有人说需要设置这个东西。

acceptor.getSessionConfig().setReadBufferSize(256);
acceptor.getSessionConfig().setReceiveBufferSize(256);

我肯定也尝试了一下,试着把这个值调大一点

acceptor.getSessionConfig().setReadBufferSize(102400);
acceptor.getSessionConfig().setReceiveBufferSize(102400);

咦,好像真的没有报underflow了,BUT,过了一会后问题还是出现了,那么肯定也不是解决办法。


接下来就是真正的办法了...  啰嗦一点。。。


解决的核心在于CumulativeProtocolDecoder


  1. 需要一个ProtocolCodecFactory拦截数据包解
public class CharsetCodecFactory implements ProtocolCodecFactory {

	@Override
	public ProtocolDecoder getDecoder(IoSession session) throws Exception {
		return new CharsetDecoder();
	}

	@Override
	public ProtocolEncoder getEncoder(IoSession session) throws Exception {
		return new CharsetEncoder();
	}
}

2.然后在启动时的chain里注册
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值