您的位置:首页 > 其它

自定义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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: