自定义Mina中的拦截器

6 篇文章 0 订阅
5 篇文章 0 订阅
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值