qq591577286 发表于 2017-1-7 06:30:22

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]
查看完整版本: Apache Mina 文档翻译