自定义Mina编解码器

本文介绍了在Mina框架下如何自定义编解码器,以实现网络数据的二进制与JAVA对象之间的转换。通过ProtocolCodecFactory接口创建ProtocolEncoder和ProtocolDecoder,用于编码和解码。示例中详细展示了自定义的LCLTextLineCodecFactory、LCLTextLineCodecDecoder和LCLTextLineCodecEncoder的实现,涉及文本换行符的匹配与处理。
摘要由CSDN通过智能技术生成

协议编解码器是在使用Mina 的时候最需要关注的对象,因为网络传输的数据都是二进制数据(byte),而在程序中面向的是JAVA 对象,这就需要在发送数据时将JAVA 对象编码二进制数据,接收数据时将二进制数据解码为JAVA 对象。

编解码器同样是以过滤器的形式安插在过滤器链上,如下所示:

// 设置过滤器(使用Mina提供的文本换行符编解码器)

acceptor.getFilterChain().addLast(

     "codec",

     newProtocolCodecFilter(new TextLineCodecFactory(Charset

           .forName("UTF-8"),

           LineDelimiter.WINDOWS.getValue(),

           LineDelimiter.WINDOWS.getValue())));

协议编解码器是通过ProtocolCodecFilter过滤器构造的,看它的构造方法,它需要一个ProtocolCodecFactory对象:

publicProtocolCodecFilter(ProtocolCodecFactory factory) {

        if (factory == null){

            throw newNullPointerException("factory");

        }

        this.factory =factory;

}

ProtocolCodecFactory接口非常直接,通过ProtocolEncoder和

ProtocolDecoder对象来构建!

public interfaceProtocolCodecFactory {

    /**

     * Returns a new (orreusable) instance of {@link ProtocolEncoder} which

     * encodes message objectsinto binary or protocol-specific data.

     */

    ProtocolEncodergetEncoder(IoSession session) throws Exception;

 

    /**

     * Returns a new (orreusable) instance of {@link ProtocolDecoder} which

     * decodes binary orprotocol-specific data into message objects.

     */

    ProtocolDecodergetDecoder(IoSession session) throws Exception;

}

ProtocolEncoder和ProtocolDecoder接口是Mina负责编码和解码的顶级接口!

编码和解码的前提就是协议的制定:比如上面我们使用的Mina自带的根据文本换行符解码的TextLineCodecFactory(),如果遇到文本换行符就开始编解码!


package lcl.mina.demo2;


import java.nio.charset.Charset;


import org.apache.mina.common.IoSession;

import org.apache.mina.filter.codec.ProtocolCodecFactory;

import org.apache.mina.filter.codec.ProtocolDecoder;

import org.apache.mina.filter.codec.ProtocolEncoder;


import lcl.mina.demo2.LCLTextLineCodecDecoder;

import lcl.mina.demo2.LCLTextLineCodecEncoder;


public class LCLTextLineCodecFactory implements ProtocolCodecFactory {


private Charset charset; // 编码格式


private String delimiter; // 文本分隔符


public LCLTextLineCodecFactory(Charset charset, String delimiter) {

this.charset = charset;

this.delimiter = delimiter;

}


//读取信息执行

public ProtocolDecoder getDecoder(IoSession session) throws Exception {

return new LCLTextLineCodecDecoder(charset, delimiter);

}


//发送编写信息执行

public ProtocolEncoder getEncoder(IoSession session) throws Exception {

return new LCLTextLineCodecEncoder(charset, delimiter);

}


}


package lcl.mina.demo2;


import java.nio.charset.CharacterCodingException;

import java.nio.charset.Charset;

import java.nio.charset.CharsetDecoder;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值