第一章 入门
本章中,我们将给你关于什么是 MINA、什么是 NIO、我什么我们在 NIO 之上开发了一个框架以及你会在其中找到什么等等的第一认识。我们也将会给你演示如何在一台 MINA 的服务器上运行一个很简单的例子。
NIO 概述 NIO API 是由 Java 1.4 引入的,从此被广泛用于各种应用。NIO API 封装了 IO 非阻塞操作。 首先,最好了解一下 MINA 是基于 NIO 1 写的。Java 7 设计了一个新版本 NIO-2,(因为我们基于 NIO 1) 我们并没有从这一版本 (NIO-2) 所带来的新加功能中获益。 也有必要了解到 NIO 中的 N 意思是 New,但是我们在很多地方将不会使用 Non-Blocking (非阻塞) 术语。NIO-2 应该被视为一个新新 (New New) I/O... java.nio.* 包包含了以下关键构造
我们在 MINA 框架中最感兴趣的是 Channels (通道)、_ Selectors_ (选择器) 以及 Buffers (缓冲),除非我们想要对用户隐藏这些元素。
本用户指南因此将把重点放在基于这些内部组件构建的每个对象上。
NIO vs BIO 很有必要来了解一下这两个 API 之间的差别。BIO,或者叫做 Blocking IO,依赖于用于阻塞模式的普通套接字:在你在套接字上进行读、写或者任何操作的时候,被调用的操作在操作结束之前将会一直阻塞住调用者。 在某些情况下,能够调用这些操作是很重要的,并且希望被调用的操作在其操作结束之后能够通知调用者:这样调用者在这段时间之内可以做一些其他的事情。 这也是在你具有众多连接的套接字时 NIO 所能提供的一个更好的方式的地方:你无须为每个连接创建一个特定的线程,你仅仅需要很少的几个来做同样事情的线程。
如果你想获得涵盖有 NIO 的更多信息,互联网上有很多相关的不错的文章,也有一些关于这方面内容的出版的书籍。
Why MINA? 写网络应用常常被视作一种高负担但低水平的开发。这是一个不经常为程序员所学习或者了解的领域,这可能是因为这些内容是在很久以前在学校里学过但都忘光了,也可能是因为这一网络层的复杂性常常被更高层的传输层所隐藏以致你从来没有深入它。 补充一点,当涉及到异步 IO 时,一个额外的复杂的层出场了:时间。 BIO (Blocking IO,阻塞 IO) 和 NIO (Non-Blocking IO,非阻塞 IO) 之间的最大的区别在于在 BIO 中,你发送了一个请求,然后你将在得到回复之前一直等待。在服务器端,这意味着一个线程可能会涉及到任何进入的连接,因此你不需要应对多路复用连接的复杂性。另一方面,在 NIO 中,你必须应对非阻塞系统的同步特性,这意味着在一些事件发生时你的应用会被调用。在 NIO 中,你无需调用了以后等待一个结果,你发送一条命令之后,结果就绪了你会被通知。 框架所需要的 考虑到这些不同,以及大多数应用程序在调用网络层的时候通常会期望一个阻塞模式,最好的解决方案就是通过写一个阻塞模式的模仿框架来隐藏掉这一表象。这就是 MINA 所做的事情! 但是 MINA 做的事情不仅于此。它为需要通过 TCP、UDP 或者任何机制通信的应用提供了一个通用 IO 幻像。如果我们仅仅考虑 TCP 或者 UDP,一个是有连接的协议 (TCP) 另一个是无连接的 (UDP)。MINA 将这种差异掩盖起来,以让你关注于对你的应用很重要的两部分:实用的代码和应用协议的编码/解码。 MINA 不仅仅处理 TCP 和 UDP,它也使用 VmpPipe 或者 APR 提供了一个串行通信 (RSC232) 之上的一层。 最后,很重要的是,MINA 是一个专门设计既能工作在客户端又能工作在服务器端的网络框架。写一个服务器的关键在于具有一个可扩展性的系统,这样可以灵活地满足服务器需求,根据性能和内存使用:这就是 MINA 的优势,使你的服务器开发变得容易。 何时使用 MINA? 这是个有趣的话题!MINA 并不期望在任何情况下都是最好的选择。在考虑使用 MINA 之前要思考几个要素:
特性
MINA 是一个简单但功能齐全的网络应用框架,它提供:
基于 Java NIO 的 TCP/IP 和 UDP/IP 基于 RXTX 的 串行通信 (RS232) In-VM 通道通信 你可以实现你自己的!
低层:使用 ByteBuffers 高层:使用用户定义的消息对象和编解码器
单个线程 一个线程池 多个线程池 (比如 SEDA)
开始的步骤 我们将通过运行一个 MINA 包提供的很简单的例子给你演示使用 MINA 是多么简单。 想要在你的应用中使用 MINA 的第一件事是要设置环境。我们将描述你需要安装什么,以及如何运行一个 MINA 程序。没啥大不了的,先来体验一下MINA 吧 ... 下载 首先,你需要从下载区下载到最新 MINA 发布版。建议选择最新版,除非你有非常好的理由不这么做 ... 一般来说,如果你要使用 Maven 来构建你的项目,你甚至不需要下载任何东西,你只需依赖进一个包含了 MINA 库的 repository:也就是说你只需告诉 Maven pom 你需要使用 MINA 包。 里边是什么 下载完成后,将 tar.gz 或 zip 文件的内容释放到本地磁盘。下载的压缩文件具有以下内容。 在 UNIX 系统,输入:
你将会在 apache-mina-2.0.7 目录下得到以下内容:|
内容详情
除此之外,基目录下还有两个许可和公告文件。
运行你的第一个 MINA 程序 下载完发布版之后,让我们运行一下发布版附带的第一个 MINA 例子吧。 将以下包放进 classpath
**日志提示** *Log4J 1.2 用户:slf4j-api.jar、slf4j-log4j12.jar; Log4J 1.2.x * Log4J 1.3 用户:slf4j-api.jar、slf4j-log4j13.jar; Log4J 1.3.x * java.util.logging 用户:slf4j-api.jar 和 slf4j-jdk14.jar。 重要提示:请确认你使用了匹配于你的日志框架的正确的 slf4j-*.jar。例如,slf4j-log4j12.jar 和 log4j-1.3.x.jar 不能够同时使用,否则会发生故障。如果你不需要一个日志框架,你可以使用没有日志的 slf4j-nop.jar 或者仅有最基本日志的 slf4j-simple.jar。 在命令行中输入以下命令:
$ java org.apache.mina.example.gettingstarted.timeserver.MinaTimeServer
这将启动服务器。现在 telnet 将会看到程序已启动。 输入以下命令来 telnet:
现在我们已经运行了第一个 MINA 程序。请试着运行 MINA 所附带的其他一些例子程序。
本章总结 在本章中,我们了解了基于 MINA 的客户端以及服务器端的应用体系。我们还涉及了 TCP 服务端/客户端、UDP 服务器端和客户端的例子实现。 在接下来的章节中我们将会讨论 MINA 的核心结构以及一些高级主题。 原文链接:http://mina.apache.org/mina-project/userguide/ch1-getting-started/ch1-getting-started.html。