滨州学院计算机科学与技术系 seesky 译制
第一章——开始
在这一章中,我们将给你什么是 MINA、NIO 的第一感觉,以及为什么我们在 NIO 上构建框架。我们还展示了如何运行一个基于 MINA
的非常简单的程序例子。
1、NIO 综述
NIO APIs 在 Java 1.4 中被给出,如今它已经在在大量的程序中被使用了。NIO APIs 允许非阻塞 IO 操作。
注意:首先,知道 MINA 是在 NIO 1 的基础上开发的是很重要的,如今在 Java 7 中一个新版本的 NIO-2 已经被设计出来,但是我们
还没有从这个版本所带有的特性中获益。
注意:知道 N 在 NIO 中的意思是 New 也是重要的,但是我们将在很多地方使用非阻塞(Non-Blocking)这个术语。NIO-2 需要被
看为 New New I/O……
java.nio.*包包含以下关键结构
� Buffers——数据容器
� Chartsets——bytes 和 Unicode 之间的翻译容器
� Channels——代表 I/O 操作的连接实体
� Selectors——提供可选择的多路复用非阻塞 IO
� Regexps——提供一些操作正则表达式的工具
我们将集中关注 MINA 框架的 Channels、Selectors 以及 Buffers 部分,其它部分我们将对用户进行隐藏。
本手册将集中关注在这些内部组件上构建我们所需要的系统。
NIO vs BIO
知道 BIO 和 Clocking IO 这两种 APIs 之间的不同是很重要的,在阻塞模型中依赖普通的 sockets 链接:当你读、写或者在 socket 上
做任何操作的时候,被调用的操作将会阻塞调用者,直到操作完成。
在一些例子中,关键是能够调用操作,并期望被调用的操作在操作完成之后能够通知调用者:这使得调用者在平均的运行时间里可以
做更多的事情。
这也就是 NIO 的优点,当你有很多的 socket 链接时,NIO 能帮你更好的处理它们:你不需要为每一个链接创建指定的进程,你只需
要使用少量的进程来做同样的事情。
如果你想获得有关于 NIO 的更多信息,网上有很多不错的文章,还有几本书讲述了有关 NIO 的问题。
2、为什么开发 MINA
编写网络程序被看做是繁重的底层开发。它一个开发者不经常学习和知晓的区域,要么是因为很久之前在学校里学过但是现在已经忘
了,或者是因为复杂的网络层总是被高层隐藏,总之你没有深入学习过它。
另外当涉及到异步 IO 的时候,一个额外的复杂层又参杂了进来:time。
BIO(Blocking IO)和 NIO(Non-Blocking IO)之间的最大的区别是,在 BIO 中,你发送一个请求,然后需要一直等待直到你获得
答复。在服务器端,这意味着一个进程将会与一个对内连接相联系,所以你不得不处理复杂的多路链接。在 NIO 中,另一方面,你需要
解决非阻塞系统的同步工作,这就意味当一些事情发生之后,你的程序将被唤醒。在 NIO 中,你不需要调用和等待结果,你发送完命令
之后,之后当恢复准备好了你将获得通知。
框架的需求
考虑到这些不同,事实上许多的程序都期待在调用网络层的时候有一个阻塞模式,而最好的解决方法就是编写一个模拟阻塞的框架来
隐藏这些不同。这就是为什么需要 MINA。
但是 MINA 可以做更多。它为使用 TCP、UDP 和其他机制进行通信提供统一的接口。当你只考虑 TCP 和 UDP 的时候,一个是有连接
的(TCP),而另外一个是无连接的(UDP)。MINA 掩饰这些不同,使你能够专注于你的程序的两个重要部分:程序的编码以及协议的
编码和解码。
MINA 不但可以处理 TCP 和 UDP,它还通过 VmpPipe 或 APR 为串口通信(RSC232)提供了一个高层接口。
最后但不是最终的,MINA 被特别的设计为能够在客户端和服务器端都能运行的网络框架。