自定义Mina中的拦截器
2016-01-31 22:01
302 查看
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 } }
相关文章推荐
- 华夏神农实习总结
- Directx11教程(14) D3D11管线(2)
- 对杀毒软件技术的浅浅理解
- JavaScript中eval函数的问题
- 3Sum Closest题解
- DropDownList绑定显示数据库多个字段
- ASP.NET Core 1.0 基础与应用启动
- code vs 刺激
- apache 有哪些 开源
- 【安卓开发】JNI开发常用接口 - 1
- indexof用法
- English in January
- LEETCODE--House Robber
- PriorityQueue源码解析
- HDU 1560 DNA sequence(IDA*搜索)
- 再谈PHP、Python与Ruby
- 4.windows和Linux下创建oracleusername表空间,表,插入数据,用户管理表等操作
- Divide and conquer:Subset(POJ 3977)
- Ubuntu彻底删除mysql
- BZOJ-1050 旅行comf 并查集+乱搞