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
}
}