概述
转自:http://hi.baidu.com/huahua035/blog/item/f41f104ff73b0b19b3de05a4.html
模拟Mina2的TextLineCodecFactory中的TextLineDecoder解码器
Mina2中已经提供了TextLine解码的方式----根据文本的换行符进行解码;
注意这里的文本换行符是和操作系统相关的,比如windows是 rn ,linux是 r;
我们就模拟一个windows下换行符的解码器------即看到 rn 就结束接受数据,把rn前的数据解码为字符串!
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;
}
}
//=============================注意=====================
注意:这里的换行符:rn是2个字节, r的ASCII是13,n的ASCII是10,千万不要把rn当作是字符串(“rn”文本换行符,而不是长度为4的字符串,注意跟 \r\n区分一下)
最后
以上就是笑点低毛衣为你收集整理的转:模拟Mina2的TextLineCodecFactory中的TextLineDecoder解码器 的全部内容,希望文章能够帮你解决转:模拟Mina2的TextLineCodecFactory中的TextLineDecoder解码器 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复