`
wangleifire
  • 浏览: 511246 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

2007 年 12 月 24 日

本文将通过一个简单的问候程序 HelloServer 来介绍 MINA 的基础架构的同时演示如何使用 MINA 开发网络应用程序。
<!----><!----> <!---->

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。

目 前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

本文将通过一个简单的问候程序 HelloServer 来介绍 MINA 的基础架构的同时演示如何使用MINA 开发网络应用程序。

环境准备

  1. 首先到官方网站下载最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html 。 下载之前先介绍一下 MINA 的两个版本:1.0.x 适合运行环境为 JDK1.4,1.1.x 适合 JDK1.5 的版本,两者的编译环境都需要 JDK1.5。JDK1.5 已经是非常普遍了,本文中使用 1.1.5 版本的 MINA,编译和运行所需的文件是 mina-core-1.1.5.jar。
  2. 下载 MINA 的依赖包 slf4j。MINA 使用此项目作为日志信息的输出,而 MINA 本身并不附带此项目包,请到http://www.slf4j.org/download.html 地址下载 slf4j 包,slf4j 项目解压后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 这两个 jar 文件。如果没有这两个文件就会导致启动例子程序的时候报 org/slf4j/LoggerFactory 类没找到的错误。
  3. 当然要求机器上必须装有 1.5 或者更新版本的 JDK。
  4. 最好你应该选择一个顺手的 Java 开发环境例如 Eclipse 或者 NetBeans 之类的,可以更方便的编码和调试,虽然我们的最低要求只是一个简单的文本编辑器而已。

 




回页首


编写代码并执行

  1. 编写代码 HelloServer.java 如下
package demo.mina.echo;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.common.*;
import org.apache.mina.transport.socket.nio.*;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

/**
 * HelloServer演示程序
 * @author liudong (
                    http://www.dlog.cn/javayou

                
)
 */
public class HelloServer {

    private static final int PORT
 = 8080;
/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
        IoAcceptor acceptor = new SocketAcceptor();        
        IoAcceptorConfig config = new SocketAcceptorConfig();
        DefaultIoFilterChainBuilder chain = config.getFilterChain();
        //使用字符串编码
        chain.addLast("codec", 
new ProtocolCodecFilter(new TextLineCodecFactory()));
        //启动HelloServer
        acceptor.bind(new InetSocketAddress(PORT
), new HelloHandler(), config);
        System.out
.println("HelloServer started on port " + PORT
);
	}
}

/**
 * HelloServer的处理逻辑
 * @author liudong
 */
class HelloHandler extends IoHandlerAdapter {
/**
 * 当有异常发生时触发
 */
@Override
    public void exceptionCaught(IoSession ssn, Throwable cause) {
        cause.printStackTrace();
        ssn.close();
    }

/**
 * 有新连接时触发
 */
@Override
public void sessionOpened(IoSession ssn) throws Exception {
    System.out
.println("session open for " + ssn.getRemoteAddress());
	}

/**
 * 连接被关闭时触发
 */
@Override
public void sessionClosed(IoSession ssn) throws Exception {
    System.out
.println("session closed from " + ssn.getRemoteAddress());
	}

/**
 * 收到来自客户端的消息
 */
public void messageReceived(IoSession ssn, Object msg) throws Exception {    
    String ip = ssn.getRemoteAddress().toString();
System.out
.println("===> Message From " + ip +" : " + msg);    
    ssn.write("Hello " + msg);
    }
}

 

  1. 编译执行

先不用试着去读懂每一行代码的具体意思,用你顺手的编译器编译 HelloServer.java,如果报错请确认是否已将前面提到的三个 jar 文件添加至类路径中。如果一切顺利接着就可以启动HelloServer 程序,启动后提示:HelloServer started on port 8080 表示启动成功,如果启动失败,问题无外乎是类没找到或者端口占用。如果端口被占用的话,换一个罗,修改 PORT 常量值后再次编译并启动。

  1. 测试服务器

打开命令行窗口,输入 telnet localhost 8080 后,输入您的英文名或者其他一些乱七八糟的字符后回车再去看看刚启动的服务程序有何反应。我的反应如下:

HelloServer started on port 8080
session open for /127.0.0.1:3023
===> Message From /127.0.0.1:3023 :hello
===> Message From /127.0.0.1:3023 :hello
===> Message From /127.0.0.1:3023 :liudong
===> Message From /127.0.0.1:3023 :Winter Lau

 

好了,一切正常,恭喜你的第一个使用 MINA 开发的网络程序已经成功运行了。

 




回页首


MINA 基本类的描述

在介绍架构之前先认识几个接口:

IoAccepter 相当于网络应用程序中的服务器端

IoConnector 相当于客户端

IoSession 当前客户端到服务器端的一个连接实例

IoHandler 业务处理逻辑

IoFilter 过滤器用于悬接通讯层接口与业务层接口

 




回页首


MINA 的基础架构

下图是 MINA 的架构图,


图 1:MINA 的架构图

在 图中的模块链中,IoService 便是应用程序的入口,相当于我们前面代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。在上面的例子中,我们是这样使用 IoAccepter 的:

IoAcceptor acceptor = new
 SocketAcceptor();

 

相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。

而在上图中最右端也就是 IoHandler,这便是业务处理模块。相当于前面例子中的 HelloHandler 类。在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。

一个 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文档):

void exceptionCaught (IoSession session, Throwable cause)
                   当接口中其他方法抛出异常未被捕获时触发此方法
void messageReceived (IoSession session, Object message)
                   当接收到客户端的请求信息后触发此方法.
void messageSent (IoSession session, Object message)
                   当信息已经传送给客户端后触发此方法.
void sessionClosed (IoSession session)
                   当连接被关闭时触发,例如客户端程序意外退出等等.
void sessionCreated (IoSession session)
                   当一个新客户端连接后触发此方法.
void sessionIdle (IoSession session, IdleStatus status)
                   当连接空闲时触发此方法.
void sessionOpened (IoSession session)
                   当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发

 

前面我们提到 IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一个用途却是必须的,那就是作为 IoService 和 IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,我们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在 messageReceived 中直接将 msg 对象强制转换成 String 对象。

而 如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得 IoHandler 不只是业务处理,还得充当协议解析的任务。

MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。

 




回页首


其他

MINA 不仅仅是用来开发网络服务器端应用程序,它一样可以使用 IoConnector 来连接到各种各样的网络服务程序。

通 过本文中 HelloServer 这个例子,我们在惊叹 MINA 可以带来多么大便利的同时,还不得不为其卓越的性能而骄傲,据称使用MINA开发服务器程序的性能已经逼近使用 C/C++ 语言开发的网络服务。作为 MINA 的入门文章,性能问题不在本文讨论范围内。

另外在 MINA 压缩包中附带有不少比 HelloServer 要好得多的例子,通过这些例子可以进一步的了解并掌握 MINA。


参考资料

分享到:
评论
2 楼 hanmiao 2013-01-21  
樓主的文章不就是來自IBM Developers里的http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/#main嗎?
1 楼 fekin 2011-01-06  
写的很好,谢谢

相关推荐

    Apache Mina入门(完成版)

    在“Apache Mina入门(完成版)”这份资料中,你将了解到以下关键知识点: 1. **Mina架构**:Mina的核心设计理念是事件驱动和异步通信,它采用了I/O多路复用技术,如Java NIO(非阻塞I/O),以提高服务端处理大量...

    mina入门实例

    这就是一个基础的Mina入门实例,展示了如何使用Mina进行客户端-服务器间的通信。随着深入学习,你可以了解更多的Mina特性,如心跳机制、多线程处理、会话管理等,以构建更复杂、高效的网络应用。

    Apache Mina 入门Demo

    通过深入学习和实践这个Apache Mina入门Demo,你将掌握如何利用Mina构建网络应用,并了解其核心特性和工作原理,这对于从事Java网络编程或者需要处理大规模并发连接的开发者来说是非常有价值的。

    Mina入门:mina版之HelloWorld

    **Mina入门:Mina版之HelloWorld** Apache Mina是一个开源项目,它提供了一个高度模块化、高性能的网络通信框架。Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina...

    mina入门例子

    本入门例子将带你了解如何使用MINA进行基本的网络通信应用开发。 首先,MINA的核心概念包括`Session`、`Filter`和`Handler`。`Session`代表一个网络连接,它是数据传输的通道;`Filter`是处理`Session`中数据的...

    ApacheMina入门(完成版)

    总之,Apache Mina为Java开发者提供了一个强大、灵活的网络通信框架,通过本文档中的"Apache Mina入门(完成版).pdf",你可以系统性地学习如何使用它来构建高效稳定的网络应用。通过实践和理解,你将能够熟练地驾驭...

    mina 入门 教程

    3. **Mina入门步骤** - **设置环境**:首先,你需要在项目中引入Mina的依赖库,通常是通过Maven或Gradle来管理。 - **创建ProtocolCodecFactory**:定义数据编码和解码的规则,以便Mina可以正确处理网络传输的数据...

    Mina入门程序

    《Mina入门程序详解》 Mina(全称Apache MINA,即Multi-purpose Infrastructure for Network Applications)是一个开源的网络通信框架,它为Java开发者提供了一种高性能、易使用的网络编程工具。Mina允许开发者创建...

    Apache Mina入门

    ### Apache Mina 入门详解 #### 一、Mina简介与应用场景 ##### Mina概述 Mina(**Mini Network Application**)是一个简洁且易于使用的Java网络应用开发框架,主要针对TCP/IP通信进行优化设计。它能够帮助开发者...

    mina入门程序

    《Mina入门程序详解》 Apache Mina是一个开源的网络通信框架,主要用于简化高效、可扩展和高性能的网络应用程序开发。Mina提供了高度抽象的网络通信API,支持TCP/IP和UDP/IP协议,常用于实现服务器端的应用,如FTP...

    Apache+Mina入门基础

    mina是一种高效的互联网网络通信架构,此资料为入门基础。

    mina2学习笔记

    #### 一、Mina入门详解 ##### 第一步:下载使用的Jar包 - **mina-core-2.0.0-M1.jar**:这是Mina核心库,提供了NIO框架的基本功能。 - **slf4j-api-1.5.2.jar**:用于日志记录的高级接口,简化了日志记录的过程。 ...

    mina2资料-各种教程

    了解以上知识点是掌握Apache MINA的基础,通过提供的学习资料,如《Mina2.0学习笔记》、《Apache MINA入门基础》和《Apache MINA Server 2.0中文参考手册》等,可以深入学习MINA的API用法、设计原理和最佳实践。...

    Apache Mina 2 完全自学手册

    #### Mina入门 **第一步:下载并配置JAR包** - **mina-core-2.0.0-M1.jar**:这是Mina的核心库,提供了主要的功能和API。 - **slf4j-api-1.5.2.jar** 和 **slf4j-log4j12-1.5.2.jar**:用于日志记录,提供了一致的...

    Mina学习笔记

    **一、Mina入门** 1. **下载使用的Jar包**: 要使用Mina,首先需要下载其发布的jar包,这些包通常包含了Mina的核心库和其他依赖库。你可以从Apache官方网站或者通过Maven仓库获取。 2. **工程创建配置**: 在...

Global site tag (gtag.js) - Google Analytics