学习了Mina的自定义CodcFactory(自定义加解码器)
- 第一步:新建一个
MyCodecFactory
类并实现ProtocolCodecFactory
接口,实现必须的方法getDecoder
和getEncoder
方法,Decorder
就是解码器,Encoder
就是加码器
这两个要自己编写. - 第二步:新建
MyEncoder
类和MyDecoder
类,分别实现ProtocolEncoder
和ProtocolDecoder
接口.其中主要实现的方法分别为encode
和’decode’
public void encode(IoSession session, Object message, ProtocolEncoderOutput out)throws Exception
该方法的参数,session
表示会话,传送过来的会话封装一些信息参数,message
表示要发送的消息,out
表示被封装后的输出流,消息处理好后用out
发出,decode
与此类似
防止数据丢失
现在客户端所有的消息都是添加了一个\n然后发送到服务端的,服务端根据发送过来的字符串解析遇到”\n”才会读取, 如果没有\n,那么服务器是不会读取的,再次接收到导游”\n”的数据,那么上一个带有”\n”的消息就会丢失,
Mina为了处理这种情况自带了一个Decoder类叫做CumulativeProtocolDecoder
顾名思义累积的解码器,也就是说,上次没有输出的信息会累加到下次遇到”\n”,当然,”\n”只是在本例中,我们可以根据自己的情况而定.
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception
可见这个方法跟ProtocolEncoder
最明显的区别就是这个方法有个bool类型的返回值,这个值代表如果确实通过out输出了,则返回true,否则返回false,返回false,数据不会丢失,累加到下次输出.
实际用处
- 比如一段XML很长,可能一开始发送了
<aa>
接着有发送了一段具体的内容<body>hello<body>
之类的,那么就要用到cumulativeProtocolDecoder了等
Client使用Mina
建立的时NioSocketConnector,Handler也要用,以及ProtocolCodercFiliter,socketAddress,传输数据还是用session