设为首页 收藏本站
查看: 915|回复: 0

[经验分享] Apache Mina的学习应用(一)

[复制链接]

尚未签到

发表于 2017-1-5 08:04:16 | 显示全部楼层 |阅读模式
  在一般的项目中使用Mina要求在发送消息前加密数据,在接收数据时解析数据。在加密和解析需要自己定义相应的解析协议。如果采用Mina是就可以简单省事的定义自己的解析和加密协议。 只需实现Mina自己的类库即可。实现相应的方法即可。
  如在客户端发送消息先加密,在服务端进行解密,服务端把执行的结果封装成对象之后,先加密之后发送到客户端,客户端,接收到信息后在解密的过程,也是多数mina应用的过程。
  首先定义自己的协议基类:
  自定义消息体必须是实现MINA的消息的加密类MessageEncoder类 和消息的解密类:MessageDecoder 类
  针对客户端消息Message 和ResultMessage 的不同解析过程主要为消息体的解析。
  在消息的加密和解密基类中定义一些公共 的方法。
  消息的加密类的基类:
  package cn.com.unutrip.java.opensource.mina.sumup.codec;
  import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.filter.codec.demux.MessageEncoder;
  import cn.com.unutrip.java.opensource.mina.sumup.message.AbstractMessage;
  /**
 * 加密消息头和消息的体的信息
 * @author longgangbai
 *
 * @param <T>
 */
public abstract class AbstractMessageEncoder<T extends AbstractMessage> implements MessageEncoder<T> {
      private final int type;
      protected AbstractMessageEncoder(int type){
    this.type=type;
      }
     
      /**
       * 加密的整个过程的
       */
      @Override
      public void encode(IoSession session ,T message ,ProtocolEncoderOutput out)throws Exception
      {
   IoBuffer buf=IoBuffer.allocate(6);
          //Enable auto-expand for easier encoding
   buf.setAutoExpand(true);
   //加密 消息头
   buf.putShort((short)type);
   buf.putInt(message.getSequence());
   //加密消息体
   encodeBody(session, message, buf);
          buf.flip();
          out.write(buf);
      }
      /**
       * 解析消息的体的方法的
       * @param session
       * @param message
       * @param out
       */
      protected abstract void encodeBody(IoSession session ,T message ,IoBuffer out);
}
  消息的解密类的基类:
  package cn.com.unutrip.java.opensource.mina.sumup.codec;
  import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.apache.mina.filter.codec.demux.MessageDecoder;
import org.apache.mina.filter.codec.demux.MessageDecoderResult;
  import cn.com.unutrip.java.opensource.mina.sumup.message.AbstractMessage;
/**
 *
 * @author longgangbai
 *
 */
public abstract class AbstractMessageDecoder implements MessageDecoder{
     private final int type;
     private int sequence;
     private boolean readHeader;
 
     protected AbstractMessageDecoder(int type){
         this.type=type;
     }
     public MessageDecoderResult decodable(IoSession session ,IoBuffer in)
     {
  //当信息头(header)中没有读取时返回需要读取 NEED_DATA
         if(in.remaining()<Constants.HEADER_LEN){
              return MessageDecoderResult.NEED_DATA;
         }
         //如果类型和长度匹配返回 OK
         if(type==in.getShort())
         {
            return  MessageDecoderResult.OK;
         }
         //如果不匹配返回NOT OK
        return MessageDecoderResult.NOT_OK; 
     }
    
    
     public MessageDecoderResult decode(IoSession session ,IoBuffer in,ProtocolDecoderOutput out)throws Exception
     {
  //当信息头(header)中没有读取时返回需要读取 NEED_DATA
         if(!readHeader){
             //忽略此种类型
             in.getShort();
             sequence=in.getInt();
             readHeader=true;
         }
         // 获取消息的解析内容
         AbstractMessage m=decodeBody(session, in);
         //如果
         if(m==null)
         {
            return  MessageDecoderResult.NEED_DATA;
         }else{
             //重新设置readerHeader 为下一次解析作准备
             readHeader=false;
         }
         m.setSequence(sequence);
         out.write(m);
        return MessageDecoderResult.OK; 
     }
     /**
      * 解析消息的body体的信息
      * @param session
      * @param in
      * @return
      */
     protected abstract AbstractMessage decodeBody(IoSession session ,IoBuffer in);
}
  Message消息体的加密和解密过程:
  package cn.com.unutrip.java.opensource.mina.sumup.codec;
  import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  import cn.com.unutrip.java.opensource.mina.sumup.message.AbstractMessage;
import cn.com.unutrip.java.opensource.mina.sumup.message.AddMessage;
  /**
 * 添加消息的解密解析器
 * @author longgangbai
 *
 */
public class AddMessageDecoder extends AbstractMessageDecoder {
  public AddMessageDecoder(){
  super(Constants.ADD);
    }
    /**
     * 解析消息体的过程
     */
    @Override
    protected AbstractMessage decodeBody(IoSession session, IoBuffer in) {
         if(in.remaining()<Constants.ADD_BODY_LEN)
         {
             return null;
         }
         AddMessage message=new AddMessage();
         message.setValue(in.getInt());
 return message;
    }
    /**
     * 解析完毕的操作
     */
    @Override
    public void finishDecode(IoSession session, ProtocolDecoderOutput output)
     throws Exception {
    }
  }
  package cn.com.unutrip.java.opensource.mina.sumup.codec;
  import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
  import cn.com.unutrip.java.opensource.mina.sumup.message.AddMessage;
/**
 *  添加消息的加密解析器
 * @author longgangbai
 *
 * @param <T>
 */
public  class AddMessageEncoder<T extends AddMessage> extends AbstractMessageEncoder<T> {
         public AddMessageEncoder() {
             super(Constants.ADD);
        }
  @Override
 protected void encodeBody(IoSession session, T message, IoBuffer out) {
     out.putInt(message.getValue());
 }
 public  void dispose()throws Exception{
            
        }
}
  文章尚未写完,请关注下文。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323969-1-1.html 上篇帖子: Apache中 KeepAlive 配置的合理使用 下篇帖子: Apache与Tomcat安装配置手册
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表