使用 Apache MINA 2 开发网络应用
如 图 1 所示,基于 Apache MINA 的网络应用有三个层次,分别是 I/O 服务、I/O 过滤器和 I/O 处理器:
I/O 服务:I/O 服务用来执行实际的 I/O 操作。Apache MINA 已经提供了一系列支持不同协议的 I/O 服务,如 TCP/IP、UDP/IP、串口和虚拟机内部的管道等。开发人员也可以实现自己的 I/O 服务。I/O 过滤器:I/O 服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。I/O 过滤器用来完成这两者之间的转换。I/O 过滤器的另外一个重要作用是对输入输出的数据进行处理,满足横切的需求。多个 I/O 过滤器串联起来,形成 I/O 过滤器链。I/O 处理器:I/O 处理器用来执行具体的业务逻辑。对接收到的消息执行特定的处理。创建一个完整的基于 Apache MINA 的网络应用,需要分别构建这三个层次。Apache MINA 已经为 I/O 服务和 I/O 过滤器提供了不少的实现,因此这两个层次在大多数情况下可以使用已有的实现。I/O 处理器由于是与具体的业务相关的,一般来说都是需要自己来实现的。
?
清单 2 中,首先创建一个 org.apache.mina.transport.socket.nio.NioSocketAcceptor
的实例,由它提供 I/O 服务;接着获得该 I/O 服务的过滤器链,并添加两个新的过滤器,一个用来记录相关日志,另外一个用来在字节流和文本之间进行转换;最后配置 I/O 处理器。完成这些之后,通过 bind
方法来在特定的端口进行监听,接收连接。服务器启动之后,可以通过操作系统自带的 Telnet 工具来进行测试,如 图 2 所示。在输入表达式之后,计算结果会出现在下面一行。
图 2. 使用 Telnet 工具测试计算器服务
在介绍了简单的计算器服务这个应用之后,下面说明本文中会使用的复杂的联机游戏应用。
下面开始以这个应用为例来具体介绍 Apache MINA 中的基本概念。先从 I/O 服务开始。
AbstractTetrisCommand
用来描述联机游戏示例应用中的消息。它是一个抽象类,是所有具体消息的基类。其具体实现如 清单 5 所示。
清单 5. 联机游戏示例应用中的消息 AbstractTetrisCommand
客户端初始化的时候,其状态为“未连接”,表示客户端还没有在服务器上面注册,此时还不能进行游戏;接着用户需要输入一个昵称来注册到服务器上面,完成之后状态迁移到“闲置”。此时客户端会接收到当前在线的所有其它用户的列表。当前用户可以邀请其它用户和他一块游戏,也可以接收来自其它用户的邀请。邀请发送出去之后,客户端的状态迁移到“邀请已发送”。如果接受了其它用户的邀请,客户端的状态迁移到“邀请已接收”。如果某个用户的邀请被另外一个用户接受的话,两个客户端的状态都会迁移到“游戏中”。
要实现这样较为复杂的状态机的话,只需要在 I/O 处理器中以声明式的方式定义状态和迁移条件就可以了。首先需要声明状态机中状态,如 清单 8 所示。
清单 8. 联机游戏示例应用中的状态声明
?
如 清单 12 所示,首先获取平台提供的受控 bean 的服务器,接着创建受控 bean(MBean)来包装想要管理和监测的对象,这里使用的是 I/O 连接器对象。最后把创建出来的受控 bean 注册到服务器即可。
在启动计算器服务应用的时候,添加下面的启动参数:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8084 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
,就启用了 JMX。接着通过 JVM 提供的“Java 监视和管理控制台”(运行 jconsole
)就可以连接到此应用进行管理和监测了。监测的结果如 图 6 所示。
图 6. 通过“Java 监视和管理控制台”管理和监测基于 Apache MINA 的应用
?
清单 13 中创建 I/O 处理器和 I/O 过滤器的方式很直接。由于不能直接从 I/O 接受器获取过滤器链,这里创建了一个 org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder
类的 bean,用来构建过滤器链。由 Apache MINA 提供的网络地址编辑器 org.apache.mina.integration.beans.InetSocketAddressEditor
允许以“主机名 : 端口
”的形式指定网络地址。在声明 I/O 接受器的时候,通过 init-method
指明了当 I/O 接受器创建成功之后,调用其 bind
方法来接受连接;通过 destroy-method
声明了当其被销毁的时候,调用其 unbind
来停止监听。
回页首
总结
Apache MINA 是一个很好的网络应用框架,它通过事件驱动的 API 为开发网络应用提供了良好的架构基础,同时也提供了丰富的 I/O 服务和 I/O 过滤器的实现,使得开发网络应用变得简单。本文详细介绍了 Apache MINA 中的基本概念,包括 I/O 服务、I/O 会话、I/O 过滤器和 I/O 处理器等,同时介绍了如何利用状态机来实现逻辑复杂的 I/O 处理器。除此之外,还讨论了 Apache MINA 如何与 JMX 和 Spring 进行集成。本文提供了一个简单的计算器服务和复杂的俄罗斯方块联机游戏作为示例,可以帮助读者更好的掌握基于 Apache MINA 的网络应用开发。