深入理解Apache Mina几个类


深入理解 Apache Mina ---- Mina 的几个类 Author:中國壹石頭 ---------------------------------------------------------------------------------------------------------------------- What we call human nature is actually human habbit . 深入理解 Apache Mina ---- Mina的几个类 最近 一直 在看 Mina 的源 码, 用了 Mina 这么 长时 间, 说 实话 , 现在 才开 始对 Mina 有了 一 些 深刻 的理 解, 关于 Mina 的基 本知 识的 介绍, 这里 就不 多说 了, 网上已 经有 很多 不错的 文 章 都对 Mina 做了 较深 刻的 剖析, 现 在就 是想从 Mina 的最 根本 的地 方来对 Mina 做一些 深 层 次 上的 探讨 。 还是 先从 Mina 的入 口程序来 说,每 当要启动 一个 Mina 的程 序(包括 服务器 和客户端 )时 候, 这里 只是 对服 务器重 点做 一些 讲解, 至于说 Mina 的客 户端 的应 用, 这里只 是简 单的 涉 及一点 , 不 会对 其做 很深 入的探 讨。 但是 Mina 的服 务器 和客 户端在 很大 的程 度上都 是一 样, 所以 这里 就 “挂一漏 万 ”的简 单讲 解一下 。 在 此之 前我 一 直想 找一 种 “串糖 葫芦 ”的方 式来 讲解 一下 Mina, 可 是 一直没 有时 间来看 Mina 的源 码, 真的 是无 从下手 ,虽 然网 上的 很多关于 Mina 的一些 文 章, 讲解 的非常 透彻 了, 但 是可 能对 于初 学者来 说, 显得 有些 深奥, 在 这里特 别的 提一下 洞庭 散人对 Mina 源码 的透 彻 的分 析,如果 你对 Mina 已经 有了一定 的了解 或者是正 在学习 Mina 的源 码,建议 你去看 看 他的 博客 , 里 面 有 很多东 西讲 的是 相当到 位的 。 在 这 里 就不在 多举 例子 了。 写 这篇 文档 主 要 是想 对刚 接触 Mina 的人 讲解 一些 Mina 的基 本知 识, 由 浅 入深 , 一步 一步 的 学习 Mina 思想 的精 髓 , 我接触 Mina 的时 间也 比较 长了, 几乎 天天 在和 它打交 道, 每当 你发 现一个 新奇 的 用法 的时候, 你真的 会被 Mina 所折 服,我这 里不是对 Mina 的吹 捧,记得 我曾经 和同事开 玩笑说,“等真 正的 懂得了 Mina, 你 就知 道什么叫 Java了”, 所 以, 我 现在 想急切 的把 现 在 所知 道和 了解 的所有 关于 Mina 的一些 东 西都 想在这 篇文 章里 面写出 来, 如 果有写 的不 到 位 的地 方还 请各 位同学 多多 指正 ,下面 就开 始对 Mina 做一个 完 整的 介绍。 一、 先说说 Mina 的几 个类 和接 口 (1)IoService (2)BaseIoService (3)BaseIoAcceptor (4)IoAcceptor (5)IoConnector 这几 个类 和接 口是整 个服 务器 或客户 端程 序 ( IoConnector) 的 入口 程序 , 其 中就 Mina 的整 体 上来 说, IoService 是所有 IO通信 的入 口程 序, 下 面 的几 个接口 和类 都是 继承或 者实 现 了 IoService 接口 。 深入理解 Apache Mina ---- Mina 的几个类 Author:中國壹石頭 ---------------------------------------------------------------------------------------------------------------------- What we call human nature is actually human habbit . 下面 先给出 Mina(入 口程 序) 的整体 架构 图: Mina 的整 体架 构图 在这 里先 提出 几个个 问题 : (1)为 什么 有了 一个 IoService 还要 再有 一个 BaseIoService? (2)BaseIoService 和IoAcceptor(IoConnector)有什 么区 别? (3)BaseIoAcceptor(BaseIoConnector)为什 么不 去直 接实现 IoService,而 是又 添加 了 IoAcceptor(IoConnector)? 带着 这几 个问 题我们 来解 读一下 Mina 的源 码: 首先 , 解 答 第一个 问题 , 为 什 么有了 一个 IoService 还要 再有 一个 BaseIoService?IoService 和BaseIoService 最明 显的 区别 就是 IoService 是 一 个接口 , 而 BaseIoService 是一个 抽 象 类。 BaseIoService 实现了 IoService 中的 部分 方法 。 这里 先把 IoService 接口 中要 实现 的方法和 BaseIoService 中实 现的 方法 列举如 下: 深入理解 Apache Mina ---- Mina 的几个类 Author:中國壹石頭 ---------------------------------------------------------------------------------------------------------------------- What we call human nature is actually human habbit . 通过对 IoService 和BaseIoService 的比 较可 以发 现, 除了 getDefaultConfig() 这个 方法 没 有 在BaseIoService 中实 现之 外, 其他的 方法 都已 经在 BaseIoService 实现 了。 这里 就有一个 问题 ,为 什么 BaseIoService 只是 实现了 IoService 的部 分方 法, 而没有 全部 实现 IoService 的方 法呢 ?通 常都知 道, 接 口 中的 方法是 必须 要由 实现类 来实 现的 , 这 点 是毋 庸置 疑的 。 你 可以 写一个 空 方法, 里 面 没有 任何 的逻辑 处理 , 但 是 你 的实现 类中 却不 能没有 该方 法。 但 是 在Mina 中作 为 实现 类的 BaseIoService 却没有 IoService 指定 的方法 getDefaultConfig() , 难道 Mina 真的 有独 到之 处?不 是! 仔 细看看 BaseIoService 你就 会知 道, BaseIoService 是 一个 抽象 类, 抽 象 类就是 用来 被继 承的, 它 提 供了 一些 其子类 公用 的一些 方法 , 当 抽 象 类 实 现一个 接 口时 , 抽 象 类可 以有 选择 性的实 现其 所有 子类都 需要 的实 现的一些 方 法, 对 于 接 口 中指 定法 方法 , 抽 象 类可 以选 择全 部实现 或者 部分 实现。 在 Mina 中如 果没有 BaseIoService 这个 抽象 类, 而是由 BaseIoAcceptor 和BaseIoConnector 直接 去实现 BaseIoService 接口, 那么 必然 会导 致这个 两个 实现 类中都 要重 写相 应的方 法, 这样 就脱离 了面 向对 象设计 的本 质, 没 有 达到 复用 的目的 。 在 BaseIoAcceptor/BaseIoConnector和BaseIoService 之间 添 加 一个 BaseIoService 就是 为了 达到 代码复 用的 目的 。在这 个问 题上 主要是 要记 住两 点: 1)抽象类在实现接口的时候可以部分或者全部实现接口中的方法。但是当抽象类只是实 现了接口中的部分方法的时候,抽象类的子类必须要实现抽象类中未实现的接口的方 法。在此处,IoService 的getDefaultConfig( ) 方法在 BaseIoService(BaseIoAcceptor 是BaseIoService 的子类,但它也是一个抽象类,所以它也没有实现 getDefaultConfig( )) ,getDefaultConfig( ) 是由 BaseIoAcceptor 的子类们来实现的(如 SocketAcceptor, 这是一个具体实现类)。所以接口的所有方法必须被具体的实现类实 现和抽象类在实现接口的时候可以部分或者全部实现接口中的方法是不矛盾的。 2)注意代码的重用。在面向对象的编程语言中都提供了抽象类和接口,抽象类和接口最 大的区别就是抽象类提供了方法的具体实现,供其子类来调用;而接口只是提供了对 方法的声明,其方法的实现要由其具体实现类来做。在 Java 中一个子类只能有一个 父类,但是却能实现多个接口。个人认为接口和抽象类各有特色,接口的使用比较灵 活,不同的接口可以让其子类扮演不同的角色,侧重于类的复用,在很大程度上解决 了代码复用的问题;抽象类更侧重的是方法的复用,某种意义上讲,抽象类的使用对 于程序来说使用起来更加轻松,但是是使用抽象类还是接口要根据具体的情况而定。 对于接口和抽象类的具体的用法请参考闫宏的《Java 与模式》中相关部分的讲解。 之所 以在 这里 罗列这 么些 问题 ,目 的不仅 仅是 为了 讲解 Mina 的原 理, 而是 想从 一个高 的 角 度来 看待 的这 个经典 的开 源项 目, 通过对 Mina 的学 习和 理解 ,能 够真正 的懂 得什 么是一 个 项目 ,什 么是 面向对 象编 程, 更本质 的东 西是 怎么灵 活运用 Java来 达到 上面 的两 个 目的 。 这个 才是 最重 要的, 哪怕 是你 在看 完本文 后对 Mina 的理 解还 是有 点模糊 ,但 是你 至少 要 知 道在 编写 一个 程序的 时候 怎样 从面向 对象 的角 度上去 思考 一个 问题, 而 不 是 在用着 面向 对 象 的语 言写 着结 构化的 程序 。 这 些 东 西都是 自己 做开 发这么 长时 间的 一些心 得, 在 这 里总 结 出 来, 目 的主 要是 用于交 流 和学 习, 不 是 在 卖弄, 只 是想 让更 多的初 学者 少走 一些弯 路, 懂 得 学习 的方 法。 还是 回到对 Mina 的刚 提出 的那 几个问 题上 来, 现在 ,第 一个问 题已 经解 决了, 为什 么有 了 一个 IoService 还要 再有 一个 BaseIoService?答 案就 是为 了代码 的复 用。 深入理解 Apache Mina ---- Mina 的几个类 Author:中國壹石頭 ---------------------------------------------------------------------------------------------------------------------- What we call human nature is actually human habbit . 其次 ,下 面开 始讨论 第二 个问 题, BaseIoService 和IoAcceptor(IoConnector)有什 么区 别? 在讨 论这 个问 题之前 ,还 是先 给出这 两个 类 (接口 )提供 的方 法, 如下图 : 在讨 论第 一个 问题的 时候 我们 已经看 过了 BaseIoService 的方 法了 , 但 是没 有对 这些 方法 的 功能 做些 梳理 ,现在 就对 这些 方法做 些简 单的 介绍: getFilterChainBuilder() 和setFilterChainBuilder(): 这两个方法主要是对一个服务的 IoFilter 的操 作,关于 IoFilter 的详细介绍会在后面给出,现在你可以将其理解为是一个处理业务逻辑的模块,例如: 黑名单的处理、数据的转换、日志信息的处理 等等都可以 在这个 IoFilter 中实现,它的工作原理和 Servlet 中的过滤器很相似。 addListener( ) 和removeListener():这两个方法通过名字看就可以理解了,就是给当前的服务添加和删除 一个监听器,这个监听器主要是用于对当前连接到服务的 IoSession 进行管理,这个也会在后面做详细的 讲解。 getManagerServiceAddress()和getManagerSessions():这两个方法的功能比较相似,一个是获取当前服 务所管理的远程地址,一个是获取当前服务所管理的会话IoSession ,IoSession 对SocketAddress 做了一 个完整的封装,你也可以先将这两个方法的功能理解为是一回事,具体的区别会在后面给出。 isManaged(): 检测某个 SocketAddress 是否处于被管理的状态。 getListeners(): 获取当前服务的监听器。 看了 上面对 BaseIoService 功能 的介 绍, 现在我 们可 以理解 BaseIoService 提供 的方 法主 要 是用 于对 当前 服务的 管理 。 那 么 要 管理一个 服 务, 前 提 条件是 这个 服务 必须存 在, 存 在 的 前 提是 什么 ,就 是要启 动一个 服 务,或 者是 连接 到一个 远程 主机 上,这 两个 任务 分别是 IoAcceptor 和IoConnector来完 成的 , 此 处要 注意 的是 这两个 对象 都是 接口, 没 有 具体 的 实 现, 具体 的实 现会由 下面 介绍 的它们 相关 的子 类 (SocketAcceptor 等)来实 现。 这样 IoAcceptor/IoConnector的功 能我 们就 可以总 结 出来 了, 就是 启动和 停止 一个 服务。 对于 一个 完整 的服务 来说 , 既 要 有 启动这 样的 前提 条件, 还 要 有对 服务 的管理 和对 服务 响 应 深入理解 Apache Mina ---- Mina 的几个类 Author:中國壹石頭 ---------------------------------------------------------------------------------------------------------------------- What we call human nature is actually human habbit . 的 逻辑 处理 , 这两个缺 一 不可 , 回到第 二 个问 题, BaseIoService 和IoAcceptor(IoConnector) 有什 么区 别? 区别就 在于 它们 实现的 功能 不一样 ,但 都是 为了 一个完 整的 服务 来打基 础的 , 两者 缺一都 不 能称为 一个 完整 的服务 。 这三 个都是 IoService 子类 (子接 口 ),IoService 只是 提供 了一些 服 务应该 具有 多基 本的方 法, BaseIoService 提供了 IoService 部分 方法 的具 体 实 现,而 IoAcceptor(IoConnector)是对 特定 服务 要具备 的操 作的 做了一些 扩 展, 这样一个 服 务完 整的 模型 正在 逐渐 向我们 清晰 的展 现出来 。 再次 ,讨 论一下 第三 个问 题。 BaseIoAcceptor(BaseIoConnector)为什 么不 去直 接实现 IoService,而 是又 添加了 IoAcceptor(IoConnector)?这个 问题 其实 在上面 已经 有所 涉及, 为了 达到 对象 复用的 目的 ,所以 Mina 的设 计者 给出 了一个 BaseIoService, IoAcceptor(IoConnector)是实 现一个 特 定服务 必须 要提 供的一些 方 法。 更具体 一点 , IoAcceptor(IoConnector)是为 了一个 特 定的服 务 (服务 器 /客户 端 )而设 计的 ,而 IoService 只 是提 供了 一个 服务应 该具 备的 一些基 本的 方法 。所 以在 Mina 中给 出了 一个 针对具 体服 务 的 一个 接口 IoAcceptor(IoConnector),这样 BaseIoAcceptor(BaseIoConnector)就提 供了 一 个 服务 所必 备的 一些条 件。 因为 它即实 现了 IoAcceptor(IoConnector)接口 又继 承了 抽象类 BaseIoService, 这 样就 实现了 IoService 中的 所有 方法 , 并 且也添 加了 特定 服务应 该具 有 的 方法 (即IoAcceptor(IoConnector)中的 方法 )。以 上就 是第 三个问 题的 答案 。 二、 Mina 中提 供的 几个 特定的 服务 从上 面的 讨论 中我们 已经 知道了 Mina 上层 的类 和接 口的一些 功 能。 即图 中所 示的 已经在 上 面解 释清 楚了 。 Mina 的上 层结 构图 (抽象 层 ) 在此 我们 可以把 Mina 的上 层结 构简 单的定 义为 Mina 的“抽象 层 ”,既 然有 了抽 象层, 肯 定就 会有 其具 体实现 ,抽 象中 最重要 的两 个类是 BaseIoAcceptor和BaseIoConnector,它 们分 别是 用于 服务器 和客 户端 的一个 入口 程序 。 首先 ,说 一下 BaseIoAcceptor中的 三个 具体 实现类 : (1) DatagramAcceptorDelegate:数 据报 UDP通信 的服 务器 入口程 序。 该类 使用 UDP协 议进 行通 信, UDP协议 主要 是用 在视频 、远 程服 务的监 听 (如心 跳程 序 )中等 数据 传输 要求 不是 很高 的地方 。 (2) VmPipeAcceptor:虚拟通道 (VM)通信 的服 务器 入口程 序。 虚 拟管 道协 议主 要用于 无线 通 信方 面。 深入理解 Apache Mina ---- Mina 的几个类 Author:中國壹石頭 ---------------------------------------------------------------------------------------------------------------------- What we call human nature is actually human habbit . (3) SocketAcceptor:TCP/IP通信 的服 务器 入口程 序。 这个 是比 较常用 的协 议, 该协议 主 要 数据 传输 要求 较高的 地方 ,比 如实时 系统 、游 戏服务 器等 。 BaseIoAcceptor及其 子类 与BaseIoAcceptor相对 应的 就是 BaseIoConnector,该 类主 要用 于客户 端程 序。 其具体 的 子类 就不 再赘 述,这 里只 给出 BaseIoConnector 及其 子类 的结 构图。 BaseIoConnector 及其 子类 关于 SocketAcceptor、IoFilter、IoProcessor、IoHandler 等会 有专 门的 文章来 讨论 。 这里 就 不在 对这 些组 件类做 详细 的说 明了。
还剩5页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf