自定义Mina中的拦截器

来源:互联网 发布:windows 机顶盒 编辑:程序博客网 时间:2024/04/30 07:57
package com.socket.server;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFactory;import org.apache.mina.filter.codec.ProtocolDecoder;import org.apache.mina.filter.codec.ProtocolEncoder;public class MyTextLineFactory  implements ProtocolCodecFactory{private MyTextLineEncoder mEncoder;private MyTextLIneDecoder mDecoder;public MyTextLineFactory(){    mDecoder = new MyTextLIneDecoder();    mEncoder = new MyTextLineEncoder();}    @Override    public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {        //解释器,用于解密        return mDecoder;    }    @Override    public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {        // 编译器,用于加密        return mEncoder;    }}

编码类MyTextLineEncoder

package com.socket.server;import java.nio.charset.Charset;import java.nio.charset.CharsetEncoder;import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolEncoder;import org.apache.mina.filter.codec.ProtocolEncoderOutput;public class MyTextLineEncoder  implements ProtocolEncoder{//加密类    @Override    public void dispose(IoSession arg0) throws Exception {        // TODO Auto-generated method stub    }    @Override    public void encode(IoSession session, Object message, ProtocolEncoderOutput out)            throws Exception {        //接收的是message           String s = null;        if(message instanceof String){            s= (String)message;        }        if(s != null){            CharsetEncoder charsetEncoder = (CharsetEncoder) session.getAttribute("encoder");   //每次获取系统的编码会耗费时间,把编码的类型保存到encoder中,每次在encoder中读取            if(charsetEncoder==null){   //如果没有数据                 Charset.defaultCharset().newEncoder();//获取系统默认的编码方式     赋值                 session.setAttribute("encoder", charsetEncoder);    //把数据添加到encoder中            }        IoBuffer ioBuffer   =IoBuffer.allocate(s.length());   //开辟内存的,大小用字符串来判断        ioBuffer.setAutoExpand(true);   //开辟大内存大小不仅仅局限于先开辟的大小,自动适应        ioBuffer.putString(s, charsetEncoder);  //发送什么数据就put什么数据的类型,发送String数据,使用putString来发送,第一个参数是数据,第二个参数是编码类型   基本使用utf-8;        ioBuffer.flip();        out.write(ioBuffer);//写出iobuffer        }    }}解释类MyTextLIneDecoder 
package com.socket.server;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolDecoder;import org.apache.mina.filter.codec.ProtocolDecoderOutput;public class MyTextLIneDecoder implements  ProtocolDecoder {//解密类    @Override    public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)            throws Exception {        int startPosition = in.position();//记录读取位置    while(in.hasRemaining()){  //读取数据        byte b = in.get();        if(b == '\n') {            //表示读取了一行,读取结束            int currentposition = in.position();  //记录当前位置            int limit = in.limit();   //读取当前行数            in.position(startPosition);  //定位到一开始的位置            in.limit(currentposition);//定位到终点的位置        IoBuffer buffer=    in.slice();  //截取一行位置        byte[] dest = new byte[buffer.limit()];   //把二进制数据转换到字节数组中        buffer.get(dest);           String str = new String(dest);   //字节数组转换成String        out.write(str);//写出数据            in.position(currentposition);   //还原位置  开始的位置            in.limit(limit);   //开始的行数        }    }    }    @Override    public void dispose(IoSession arg0) throws Exception {        // TODO Auto-generated method stub    }    @Override    public void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)            throws Exception {        // TODO Auto-generated method stub    }}
1 0
原创粉丝点击