Apache Mina 文档翻译
第一章 - 开始原文:http://mina.apache.org/mina-project/userguide/ch1-getting-started/ch1-getting-started.html
在这一章,我们将讨论MINA的是什么,NIO是什么, 为什么我们要在NIO上再开发一个框架,你可以在这个框架里找到什么。最后我们也会通过MINA运行一个非常简单的服务器的例子。
NIO概要
NIO API是从Java 1.4 开始出现,后来被很多应用程序使用, NIO API允许非阻塞式IO操作。
首先要说的是MINA是建立在NIO的第一个版本上的, 从Java7开始出现了NIO的第二版,但是在MINA的当前版本中我们还没有利用NIO2所提供的新特性。
另外要知道虽然NIO中的N最开始的时候代表New的意识,即新IO。但是现在大多情况下我们理解为Non-Blocking的意识,即非阻塞IO。NIO2应该被理解为New New IO,即新新IO。。。
java.nio.*包里包含如下关键的组件:
Buffers - 数据容器
Chartsets - 把byte数组转换为Unicode,或逆向转换
Channels - 用于表现具有IO操作能力的网络连接
Selectors - 提供可以被选择的,多路复用的非阻塞IO
Regexps - 提供了一些操作正则表达式的工具
这MINA框架里我们大多只关心Channel,Selector和Buffer。只是我们想要把它们的复杂性对用户隐藏起来。因此在这个文档里,我们会专注与建立在这些内部组件基础上的所有东西。
NIO和BIO
理解这两个API的不同之处很重要, BIO(阻塞时IO),依赖于阻塞模式的普通socket:你读写一个socket,或者对socket进行其他调用时,这个被调用的操作会阻塞调用的线程,直到操作完成。
有些情况下,我们希望调用某个IO操作,然后当操作完成时系统能通知调用者,在这段时间里调用者能同时做一些其他事情。
当有大量socket连接时,NIO提供了一个更好的方式来处理IO操作:你不必为每一个连接创建一个线程, 你只需要少量的线程来完成这些工作。
如果你想了解NIO的更多信息,在网络上你可以找到很多关于NIO的文章和一些书。
为什么会出现MINA?
写一些网络应用程序有时候是比较难的,而且需要使用一些底层API。在这个领域,开发者很少有足够的学习和了解。或者即使在学校里学习过,由于过了很长时间,很多相关知识都已经被忘记。或者很多时候网络层的复杂性都被高级API隐藏起来了,开发人员从来没有深入研究过。
另外加入了异步处理以后,又增加了另一个复杂性:时间
使用BIO和NIO的不同之处在于:
使用BIO的时候,你发送一个请求然后等待响应。在服务端这意味着你要为每一个进来的连接创建一个线程,因此你不用去处理复杂的网络连接复用。
使用NIO的时候,你需要处理非阻塞系统天生的异步特性,这意味着你的应用会在某些事件发生时被调用。在NIO里你不是简单的调用然后等待结果,而是发出一个命令,然后在处理完成时被通知。
因此我们需要一个框架
考虑到这些不同之处,事实上很多应用程序期望在调用网络层的时候能通过阻塞方式进行。 其实更好的解决方法是把非阻塞的部分隐藏起来,做一个框架来模拟阻塞模式。这既是MINA所做的。
但是MINA所提供的不仅限于此。它为应用程序提供了统一的IO视角,无论你需要用TCP,UPD还是任何其他机制传输数据。 如果我们仅考虑TCP和UPD, 其中的TCP是基于连接的传输协议, 而UPD是基于非连接的传输协议。MINA把这些不同之处隐藏起来,这样开发人员可以集中精力关注更重要的部分:应用的代码和协议的编码和解码。
MINA不仅仅支持TCP和UDP。它还提供了对串口通信(RSC232),VM管道, APR的支持。
最后,MINA是一个同时面向客户端和服务器两种环境设计的网络框架。 在做服务器的时候,可扩展性很重要,要能够在性能和内存使用上适应各种服务器的需求。在
这点上MINA做的很好,并且同时能让你更容易的开发服务器应用。
什么时候用MINA?
这是一个很有趣的问题!MINA并不期望在任何情况下都成为最佳选择。 这里有一些在使用MINA时需要考虑的因素:
简单易用。 在对性能没有苛刻要求的时候MINA是个很好的选择,它能让你开发服务器或客户端变得很容易。 如果使用底层API(无论是BIO还是NIO)来实现一样的应用程序时,你需要处理很多参数和用例。你可能只有数十行代码就可以实现,但是用底层API有很多陷阱,你很有可能会掉进去。
应对高连接数。BIO确实是比NIO效率高的,大概有30%。 这个事实在只有千人规模的连接时是正确的, 但是达到某一点后BIO就会失去可扩展性:你不可能在百万连接时为每一个用户创建一个线程。 但是NIO可以应对这样的环境。另一方面在你的代码里为了使用MINA而付出的成本相对于整个应用的成本是微乎其微的。同样很明显,自己去写一个网络层的框架而付出的成本是很多时候是不值得的。
久经考验。 在全世界有数十个应用系统在使用MINA。一些Apache的项目是基于MINA, 并且他们都运行良好。 比起你自己花大量的时间去应对代码中的错误,使用MINA要更有保证。
既存协议的支持。 MINA里有很多既存协议的实现:HTTP, XML, TCP, LDAP, DHCP, NTP, DNS, XMPP, SSH, FTP… 在某些方面看,MINA已经不仅仅是一个NIO框架, 同时也是一些网络协议的实现框架。 MINA的特性之一就是提供大量的协议实现。
功能特性
MINA是一个简单的却有功能丰富的网络应用程序框架, 它提供如下特性:
为各种传输类型提供一套统一的API
通过Java NIO实现 TCP/IP & UPD/IP通信
通过RXTX实现串口通信(RS232)
VM内部管道通信
你可以实现自己的通信方式
通过Filter接口实现扩展点;类似与Servlet的Filter
低级和高级的API
低级:使用ByteBuffer
高级:用户自定义的消息对象和编码
可以自由定制的线程模型
单线程
一个线程池
多个线程池(例如 SEDA)
利用Java5的SSLEngine实现的开箱即用的SSL,TLS, StartTLS功能
过载保护 和 带宽限制
通过Mock对象可以进行单体测试
通过JMX管理服务器
通过StreamIoHandler支持基于流的I/O
可以整合进PicoContainer和Spring等常用容器
很容易从Netty迁移过来。
第一步
我们将通过运行MINA包里提供的一个例子向你展示使用MINA是多容易的事情。
当你需要在自己的应用中使用MINA时, 你要做的第一件事情配置环境。我们将说明如何安装和运行MINA程序, 并不是什么奇妙的事情只是尝试一下MINA。。。
下载
首先去下载页面(http://mina.apache.org/mina-project/downloads.html)下载最新版本的MINA,除非你有特殊需求否则请使用MINA的最新版本。
一般来说,如果你使用Maven来构建你的项目,你不需要下载任何东西,如果你使用的Maven仓库里已经包含了MINA库,你只需要把MINA的Jar包添加到POM中既可。
下载包里有什么
下载完成以后, 解压tar.gz或zip文件到硬盘。 包里的结构如下:
在UNIX系统,输入:
$ tar xzpf apache-mina-2.0.7-tar.gz
在apache-mina-2.0.7目录你可以看到:
|
+- dist
+- docs
+- lib
+- src
+- LICENSE.txt
+- LICENSE.jzlib.txt
+- LICENSE.ognl.txt
+- LICENSE.slf4j.txt
+- LICENSE.springframework.txt
+- NOTICE.txt
内容详细:
dist - 包含MINA库的jar文件
docs - 包含API文档和代码的xrefs
lib - 包含MINA需要的第三方jar包
除此之外,根目录下还有一些许可证说明。
运行第一个MINA程序
我们已经下载了MINA, 让我们来运行MINA包中包含的一个MINA例子程序。
把下面的jar文件添加在classpath里
mina-core-2.0.7.jar
mina-example-2.0.7.jar
slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar
log4j-1.2.17.jar
关于Logging
Log4J 1.2 用户: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
Log4J 1.3 用户: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
java.util.logging 用户: slf4j-api.jar and slf4j-jdk14.jar
注意:请保证你使用的 slf4j-*.jar适合你的logging框架。 例如:slf4j-log4j12.jar和log4j-1.3.x.jar不能一起使用。 如果你不需要logging框架你可以使用slf4j-nop.jar,如果你只需要最简单的log功能你可以使用slf4j-simple.jar。
在命令行里输入下面的命令
$ java org.apache.mina.example.gettingstarted.timeserver.MinaTimeServer
这会启动一个服务器,现在通过telnet看看程序是什么样子的。
telnet 127.0.0.1 9123
现在我们已经运行了第一个MINA程序。 你不妨可以像上面这样试一试其他的应用程序。
总结
在这一章中我们看到了基于MINA的客户端和服务端的应用程序架构。我们接触了简单的TCP的客户端-服务器实现, 和UDP服务器-客户端实现。
接下来的章节中我们会讨论MINA的核心组件和高级功能。
页:
[1]