`

Apache Mina的学习应用(一)

阅读更多

        在一般的项目中使用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{
             
        }
}

 

文章尚未写完,请关注下文。

分享到:
评论

相关推荐

    apache-mina-2.0.4架包及源码各pdf学习教程

    apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...

    Apache MINA使用案例源代码

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的...

    Apache Mina Server 2.0 参考手册

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    Apache Mina Server 2.0 中文参考手册

    帮助你快速学习Mina框架,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信框架。Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用。

    Apache_Mina2.0学习笔记

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 引言 1 一. Mina入门 2 第一步.下载使用的Jar包 2 第二步.工程创建配置 2 第三步.服务端程序 3 第四步.客户端程序 6 第五步.长...

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...

    Apache_Mina2.0学习笔记(初版).doc

    Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议...

    mina实例、资源包、学习文档

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    mina开发示例

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    mina2.0初学教程

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    Mina2.0学习笔记(完整版).doc

    Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议...

    Mina所需要的第三方jar

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    mina带心跳长链接+socket长链接+线程池

    mina带心跳长链接,可实现服务间通信。socket长连接实现客户端与服务端的通信。对于通信技术学习是非常好的资料。改造后可实现企业应用

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    JAVA上百实例源码以及开源项目

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    neowal1:my_first_github_project

    Apache Camel是一个小型库,具有最小的依赖关系,可轻松嵌入任何Java应用程序中。 无论使用哪种传输方式,Apache Camel都可以使您使用相同的API,因此,一旦学习了API,便可以与现成提供的所有组

    根据仿人人客户端教程,编程实现Demo(四)---个人主页的实现(已完结)

    我的下个Demo准备仿照网上的QQ以及微信的DEmo,根据Apache-mina 开源Socket框架,实现一个简易的聊天交互软件。。。 特别注意:由于Demo里面用的是测试帐号,所以,如果要Demo成功运行,需要自己去人人开发者网站上面...

Global site tag (gtag.js) - Google Analytics