Apache Mina的学习应用一.docx
《Apache Mina的学习应用一.docx》由会员分享,可在线阅读,更多相关《Apache Mina的学习应用一.docx(7页珍藏版)》请在冰豆网上搜索。
![Apache Mina的学习应用一.docx](https://file1.bdocx.com/fileroot1/2022-10/10/0ffff4a3-9800-4e9f-8905-2586c619ea3b/0ffff4a3-9800-4e9f-8905-2586c619ea3b1.gif)
ApacheMina的学习应用一
ApacheMina的学习应用
(一)
在一般的项目中使用Mina要求在发送消息前加密数据,在接收数据时解析数据。
在加密和解析需要自己定义相应的解析协议。
如果采用Mina是就可以简单省事的定义自己的解析和加密协议。
只需实现Mina自己的类库即可。
实现相应的方法即可。
如在客户端发送消息先加密,在服务端进行解密,服务端把执行的结果封装成对象之后,先加密之后发送到客户端,客户端,接收到信息后在解密的过程,也是多数mina应用的过程。
首先定义自己的协议基类:
自定义消息体必须是实现MINA的消息的加密类MessageEncoder类和消息的解密类:
MessageDecoder类
针对客户端消息Message和ResultMessage的不同解析过程主要为消息体的解析。
在消息的加密和解密基类中定义一些公共的方法。
消息的加密类的基类:
package.unutrip.java.opensource.mina.sumup.codec;
importorg.apache.mina.core.buffer.IoBuffer;
importorg.apache.mina.core.session.IoSession;
importorg.apache.mina.filter.codec.ProtocolEncoderOutput;
importorg.apache.mina.filter.codec.demux.MessageEncoder;
import.unutrip.java.opensource.mina.sumup.message.AbstractMessage;
/**
*加密消息头和消息的体的信息
*@authorlonggangbai
*
*@param
*/
publicabstractclassAbstractMessageEncoderimplementsMessageEncoder{
privatefinalinttype;
protectedAbstractMessageEncoder(inttype){
this.type=type;
}
/**
*加密的整个过程的
*/
@Override
publicvoidencode(IoSessionsession,Tmessage,ProtocolEncoderOutputout)throwsException
{
IoBufferbuf=IoBuffer.allocate(6);
//Enableauto-expandforeasierencoding
buf.setAutoExpand(true);
//加密消息头
buf.putShort((short)type);
buf.putInt(message.getSequence());
//加密消息体
encodeBody(session,message,buf);
buf.flip();
out.write(buf);
}
/**
*解析消息的体的方法的
*@paramsession
*@parammessage
*@paramout
*/
protectedabstractvoidencodeBody(IoSessionsession,Tmessage,IoBufferout);
}
消息的解密类的基类:
package.unutrip.java.opensource.mina.sumup.codec;
importorg.apache.mina.core.buffer.IoBuffer;
importorg.apache.mina.core.session.IoSession;
importorg.apache.mina.filter.codec.ProtocolDecoderOutput;
importorg.apache.mina.filter.codec.demux.MessageDecoder;
importorg.apache.mina.filter.codec.demux.MessageDecoderResult;
import.unutrip.java.opensource.mina.sumup.message.AbstractMessage;
/**
*
*@authorlonggangbai
*
*/
publicabstractclassAbstractMessageDecoderimplementsMessageDecoder{
privatefinalinttype;
privateintsequence;
privatebooleanreadHeader;
protectedAbstractMessageDecoder(inttype){
this.type=type;
}
publicMessageDecoderResultdecodable(IoSessionsession,IoBufferin)
{
//当信息头(header)中没有读取时返回需要读取NEED_DATA
if(in.remaining()returnMessageDecoderResult.NEED_DATA;
}
//如果类型和长度匹配返回OK
if(type==in.getShort())
{
returnMessageDecoderResult.OK;
}
//如果不匹配返回NOTOK
returnMessageDecoderResult.NOT_OK;
}
publicMessageDecoderResultdecode(IoSessionsession,IoBufferin,ProtocolDecoderOutputout)throwsException
{
//当信息头(header)中没有读取时返回需要读取NEED_DATA
if(!
readHeader){
//忽略此种类型
in.getShort();
sequence=in.getInt();
readHeader=true;
}
//获取消息的解析内容
AbstractMessagem=decodeBody(session,in);
//如果
if(m==null)
{
returnMessageDecoderResult.NEED_DATA;
}else{
//重新设置readerHeader为下一次解析作准备
readHeader=false;
}
m.setSequence(sequence);
out.write(m);
returnMessageDecoderResult.OK;
}
/**
*解析消息的body体的信息
*@paramsession
*@paramin
*@return
*/
protectedabstractAbstractMessagedecodeBody(IoSessionsession,IoBufferin);
}
Message消息体的加密和解密过程:
package.unutrip.java.opensource.mina.sumup.codec;
importorg.apache.mina.core.buffer.IoBuffer;
importorg.apache.mina.core.session.IoSession;
importorg.apache.mina.filter.codec.ProtocolDecoderOutput;
import.unutrip.java.opensource.mina.sumup.message.AbstractMessage;
import.unutrip.java.opensource.mina.sumup.message.AddMessage;
/**
*添加消息的解密解析器
*@authorlonggangbai
*
*/
publicclassAddMessageDecoderextendsAbstractMessageDecoder{
publicAddMessageDecoder(){
super(Constants.ADD);
}
/**
*解析消息体的过程
*/
@Override
protectedAbstractMessagedecodeBody(IoSessionsession,IoBufferin){
if(in.remaining(){
returnnull;
}
AddMessagemessage=newAddMessage();
message.setValue(in.getInt());
returnmessage;
}
/**
*解析完毕的操作
*/
@Override
publicvoidfinishDecode(IoSessionsession,ProtocolDecoderOutputoutput)
throwsException{
}
}
package.unutrip.java.opensource.mina.sumup.codec;
importorg.apache.mina.core.buffer.IoBuffer;
importorg.apache.mina.core.session.IoSession;
import.unutrip.java.opensource.mina.sumup.message.AddMessage;
/**
*添加消息的加密解析器
*@authorlonggangbai
*
*@param
*/
publicclassAddMessageEncoderextendsAbstractMessageEncoder{
publicAddMessageEncoder(){
super(Constants.ADD);
}
@Override
protectedvoidencodeBody(IoSessionsession,Tmessage,IoBufferout){
out.putInt(message.getValue());
}
publicvoiddispose()throwsException{
}
}
文章尚未写完,请关注下文。