转:模拟Mina2的TextLineCodecFactory中的TextLineDecoder解码器

转自:http://hi.baidu.com/huahua035/blog/item/f41f104ff73b0b19b3de05a4.html
模拟Mina2的TextLineCodecFactory中的TextLineDecoder解码器

Mina2中已经提供了TextLine解码的方式----根据文本的换行符进行解码;

注意这里的文本换行符是和操作系统相关的,比如windows是 \r\n ,linux是 \r;

我们就模拟一个windows下换行符的解码器------即看到 \r\n 就结束接受数据,把\r\n前的数据解码为字符串!

demo:

public class VamsMessageDecoder extends CumulativeProtocolDecoder {
private static Logger logger = Logger.getLogger(VamsMessageDecoder.class);
private final Charset charset;
int str_len = 0;
IoBuffer buf = IoBuffer.allocate(0).setAutoExpand(true).position(0);
public VamsMessageDecoder(Charset charset) {
super();
this.charset = charset;
}
@Override
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
String message = "";
boolean mark1 = false;
boolean mark2 = false;
char temp_char;
CharsetDecoder charsetDecoder = charset.newDecoder();
while (in.hasRemaining()) {
byte b = in.get();
temp_char = (char) b;
logger.info("---" + temp_char + "-----");
buf.put(b);
str_len++;
logger.info("len-----"+str_len);
if (b == '\r') {
logger.info("换行01");
mark1 = true;
continue;
}
if (b == '\n' && mark1) {
logger.info("换行02");
mark2=true;
break;
}
}
if(mark1 && mark2){
buf.flip();
message = buf.getString(str_len, charsetDecoder);
logger.info("-----------len-"+str_len+"-----str-"+ message+"----");
str_len = 0;
//buf = IoBuffer.allocate(0).setAutoExpand(true).position(0); // buf已经取光了,所以不用重复的初始化
out.write(message.substring(0, message.length() - 2));
return true;
}
return false;
}
}

//=============================注意=====================

注意:这里的换行符:\r\n是2个字节, \r的ASCII是13,\n的ASCII是10,千万不要把\r\n当作是字符串(“\r\n”文本换行符,而不是长度为4的字符串,注意跟 \\r\\n区分一下)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值