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中须要发送的协议全部发送完。

  • 相关阅读:
    Study Plan The Twelfth Day
    Study Plan The Fifteenth Day
    Study Plan The Seventeenth Day
    Study Plan The Tenth Day
    Study Plan The Eighth Day
    Study Plan The Eleventh Day
    Study Plan The Sixteenth Day
    Study Plan The Thirteenth Day
    Study Plan The Fourteenth Day
    Study Plan The Ninth Day
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5193763.html
Copyright © 2011-2022 走看看