zoukankan      html  css  js  c++  java
  • Apache Mina开发手冊之四

    Apache Mina开发手冊之四

    作者:chszs,转载需注明。

    博客主页:http://blog.csdn.net/chszs

    一、Mina开发的主要步骤

    1、创建一个实现了IoService接口的类

    IoService接口有两个子接口:
    1)IoAcceptor接口,用于server
    2)IoConnection接口,用于client

    IoService接口的目的是提供服务。有几个默认实现:
    NioDatagramAcceptor、NioDatagramConnector
    NioSocketAcceptor、NioSocketConnector
    VmPipeAcceptor、VmPipeConnector
    ProxyConnector

    2、设置一个过滤器。假设须要自己定义过滤器,那么此过滤器须要实现了IoFilter接口
    IoFilter作用是建立一层过滤网。作用与Servlet规范中的过滤器一样。
    IoFilter接口的默认实现比較多,有些仅供内部使用。有些供用户使用,并且过滤器的顺序能够影响程序的执行。

    经常使用的实现类包含:
    1)ExecutorFilter:从此过滤器后的不论什么操作都工作于这个Executor
    2)LoggingFilter:日志操作过滤器,记录日志用的
    3)ProtocolCodecFilter:实现协议层和业务层的分离。


    4)ProxyFilter:代理过滤器,拦截请求或响应,转发给代理。


    5)SslFilter:用于SSL通信

    3、创建一个实现了IoHandler接口的处理类,用于处理事件
    处理业务逻辑,尤其要注意里面的IoSession接口。

    4、对IoService绑定一个port開始工作

    二、Mina自己定义协议

    Mina中的样例:
    org.apache.mina.example.chat:支持Spring、Jmx、自己定义协议
    org.apache.mina.example.imagine:支持Jmx、自己定义协议
    org.apache.mina.example.sumup:支持自己定义协议
    org.apache.mina.example.tapedeck:状态机的示范、自己定义协议

    三、协议解码器

    协议解码器是依赖于ProtocolDecoder接口:

    public interface ProtocolDecoder{
      // 把二进制协议或特定协议的内容解码成高级消息
      void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out);
      // 当指定的会话关闭时调用此方法
      void finishDecode(IoSession session, ProtocolDecoderOutput out);
      // 释放此解码器相关的全部资源
      void dispose(IoSession session) throws Exception;
    }

    由于异步的原因,传过来的IoBuffer所接受的内容是不全然确定的,也即IoBuffer中对于一次receive后。存放的不一定是一个完整的协议。有可能是多个不完整的协议。也可能刚好是一个完整的协议。这些都不确定。
    基于以上情况,实际开发通常是实现CumulativeProtocolDecoder类,此抽象类的作用是为解析协议提供一些帮助,此抽象类实现了ProtocolDecoder接口中的decode接口。并抽象出一个doDecode方法。

    doDecode方法要求假设能解析一个协议,则把此协议解析后放入ProtocolDecoderOutput类,并返回true。反之则直接返回false。并须要手动回滚POS。

    协议解码器类有两种工作方式:
    1)全然交由doDecode处理
    2)逻辑部分交由doDecode方法处理。IoBuffer是半自己主动的

    四、协议编码器

    协议编码器依赖于ProtocolEncoder接口。


    public interface ProtocolEncoder{
      // 把高级消息对象编码成二进制或特定协议的数据
      void encode(IoSession session, Object message, ProtocolEncoderOutput out);
      // 释放此协议编码器相关的全部资源
      void dispose(IoSession session) throws Exception;
    }

    协议编码器能够做到全自己主动,由于能够一次性把所需的内容写入IoBuffer,并交给ProtocolEncoderOutput,后台会依据缓冲区的大小。能写入多少就写入多少,直到把ProtocolEncoderOutput中须要发送的协议全部发送完。

  • 相关阅读:
    HDU 2112 HDU Today,最短路径算法,Dijkstra
    最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)
    图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)
    合并相同值得单元格(纵向)
    request.startAsync()不支持异步操作
    DIV强制不换行
    兼容各浏览器的css背景图片拉伸代码
    程序猿之八荣八耻
    使用JEECG过程中的问题汇总(持续更新)
    Firefox的缓存问题
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5193763.html
Copyright © 2011-2022 走看看