举报 只看楼主 发言
楼主 ヅ虫虫ゎ 管理员 2014-01-23 14:34:18
第一章,我们将会告诉你什么是MINA,什么是NIO,我们为什么在NIO基础上研发一种框架以及里面你会发现什么。我们还将向你展示如何运行一个非常简单的MINA示例服务器。
1、NIO概述
NIO API是在Java 1.4中引入的,后来被用于广泛的应用程序中。NIO API覆盖IO非阻塞操作。
首先,很高兴知道MINA是编写在NIO-1之上的。新版本被设计在Java 7中,NIO-2,我们并没有在这个版本携带和添加的特性中受益。
也很重要的知道N在NIO意味着新的,但是我们将在许多地方使用非阻塞。NIO-2应被视为一个新新的I/O...
java.nio.* 这个包包括如下关键结构
Buffers - 数据容器
Chartsets - 容器翻译字节并且解码
Channels - 代表连接实体的IO操作能力
Selectors - 提供可选择的、多路非阻塞IO
Regexps - 提供一些工具来操作正则表达式
我们在MINA框架中主要是对Channels,_Selectors_ 和 Buffers部分感兴趣。除了我们要隐藏这些元素给用户。
本用户指南将专注于一切构件在这个上面的内部组件。
NIO vs BIO
重要的是要理解者两个api之间的区别。BIO或阻塞IO,依赖于普通套接字用于阻塞模式:当你读、写或套接字上做任何操作,被调用的操作将阻塞调用者直到操作完成。
在某些情况下,它关键能够调用操作,并切期望在调用操作完成操作的时候通知调用者。 这意味着调用者可以同时做其他事情。
这就是当你有大量连接套接字时,NIO提供了一个更好的方法来处理IO:你不必为每个连接创建一个特定的线程,你可以使用一些线程来做同样的工作。
如果你想获得更多关于NIO的信息,在网络上有很多好的文章,以及一些书籍涵盖它。
2、何必有MINA?
写一些网络应用程序generrally视为负担和低水平发展。这个是一个不被开发者经常学习或了解的领域,要么就是很早以前在学校里研究的事情了,一切都已经被遗忘了,或者应为这个网络层的复杂性常常隐藏在跟高的水平,所以你永远不会得到深入。
补充一下,在异步IO以及另外一些复杂层面发挥作用:时间。
最大的区别在于BIO(阻塞IO)和NIO(非阻塞IO)是在BIO基础上的,你发送一个请求,你等待你得到的响应。在服务器端,这意味着一个线程会被关联到任何传入的连接,所以你不需要处理多路复用连接的复杂性。在NIO,另一方面,你必须处理的同步性质非阻塞系统,这就意味着应用程序将一些事件发生时调用。在NIO,你不调用和等待结果,你发送一个命令和通知时,结果是准备好了。
需要一个框架
考虑这些差异,和大多数的应用程序通常调用网络层时是期待一个阻塞模式,最好的解决方案是通过编写一个框架隐藏这方面,模拟一个阻塞模式。这是MINA要做的!
但MINA做了更多。它提供了一个需要通过TCP通信、UDP或者其他机制的应用程序的通用IO版本。如果我们只考虑TCP和UDP,一个是连接协议(TCP),另一个是无线连接(UDP)。MINA屏蔽了这种差异,让你专注于为你的应用程序很重要的两部分:适配代码和应用协议编码/解码。
MINA不仅处理TCP和UDP,它也在串行通信(RSC232)、VmpPipe或APR之上提供了一层处理。
最后,同样重要的是,MINA是一个网络框架,专门设计工作在客户端和服务器端。是写一个服务器使其具备一个可伸缩系统的关键,它可适应服务器在性能和内存使用的需求:这就是MINA骄傲的地方,还使得更容易拓展你的服务器。
何时使用MINA?
这是一个有趣的问题,MINA不一定在任何情况下都是一个最好的选择。有些情况下就要考虑考虑使用MINA,让我们列举一下:
(1)当你没有特殊的性能需求的易用性,MINA可能是一个不错的选择,因为它允许你轻易开发服务器或客户端。当你在BIO或NIO上编写相同的应用程序时不需要处理各种参数和用例。你大概可以几十行写你的服务器,并且你可能会进入误区。
(2)大量的用户连接BIO明显比NIO更快。不同的是一些事情30%支持BIO。这真的是几千的链接用户。但在一定程度上,BIO的方法就是停止扩展:你不可能处理数百万计的连接用户让每一个用户使用一个线程!NIO能。现在,另一个方面是,所花费在MINA代码上的时间可能不是最重要的一部分,而不管你应用程序相比的消耗。在某种程度上,在你自己几乎没有引起注意的情况下,它可能不只是花费你更多宝贵精力写自己更快的网络层。
(3)MINA是由世界各地数以万计的应用程序论证的系统。有一些基于MINA的Apache项目他们工作运行的很好。这是在某种形式上保证了在你自己的网络层实现上的一些神秘错误不需要花费几个小时。
(4)现有supportd协议,MINA附带各种现有的协议实现:HTTP、XML、TCP、LDAP、DHCP、XMPP、SSH、FTP...在某种程度上,不仅可以看到MINA NIO框架,但作为一个网络层协议实现。MINA特性之一是在不久的将来提供一组你可以使用的现有协议。
3、特性
MINA是一个简单当功能全面的网络应用框架,它提供:
(1)为各种传输类型统一API:
#)TCP/IP & UDP/IP 通过Java NIO
#)串行通信(RS232)通过RXTX
#)In-VM 管道通信
#)你可以实现你自己的!
(2)过滤器接口作为一个扩展点,类似于Servlet过滤器。
(3)低级和高级API:
#)低级:使用ByteBuffers
#)高级:使用用户定义消息对象和编解码器
(4)高度可定制的线程模型:
#)单线程
#)一个线程池
#)一个以上的线程池(如:SEDA)
(5)开箱即用的SSL、TLS、StartTLS 支持使用Java 5 SSL引擎
(6)过载保护和流量节流
(7)单元测试使用模拟对象
(8)JMX可管理性
(9)基于流的I/O支持通过StreamIoHandler
(10)与众所周知的容器如PicoContainer和Spring 集成
(11)从Netty平滑迁移,Apache MINA的祖先。
4、第一步
我们将展示你是多么容易使用MINA,通过提供的MINA包运行一个非常简单的例子。
当你想要在你的应用程序中使用MINA你必须做的第一件事情是配置你的环境。我们将描述你需要安装什么以及如何运行MINA的程序。没有修饰,只是第一次MINA的感觉…
下载
首先,你必须从下载部分(http://mina.apache.org/mina-project/downloads.html)下载最新的MINA版本。尽量下载最新版本,除非你有很好的理由不这样做……
一般来说,如果你要使用Maven构建你的项目,你甚至不需要下载任何东西,只要你依赖已经存在于资源库中的MINA库:告诉你的Maven poms,你希望使用需要的MINA jars。
里面是什么
在完成下载之后,提取tar.gz 或者 zip文件中的内容到本地硬盘。下载的压缩文件有以下内容:
在UNIX系统上,类型:
$ tar xzpf apache-mina-2.0.7-tar.gz
在apache-mina-2.0.7 目录下,你将获取:
内容清单:
(1)dist - 包含MINA的jar库代码
(2)docs - 包含API 文档 和 代码参照
(3)lib -
包含所有使用MINA库所需的jar
额外的这些,基本目录包含许可和通知文件
运行你的一个MINA程序
我们已经下载了发布版,让我们先来运行我们的MINA的例子,附带的版本。
将如下jar放到classpath中
**日志提示**
*Log4J 1.2用户:slf4j-api.jar 、 slf4j-log4j12.jar和Log4J 1.2.x
*Log4J 1.3用户:slf4j-api。slf4j-log4j13 jar。jar和Log4J 1.3.x
*java.util.logging用户:slf4j-api.jar和slf4j-jdk14.jar
重要:请确保您使用正确的slf4j-*.jar跟你的日志框架jar相匹配。例如,slf4j-log4j12.jar和log4j-1.3.x.jar不能一起使用,并将报错。如果你不需要日志框架可以使用slf4j-nop对于没有日志或slf4j-simple jar非常基本的日志。
在命令提示符下,发出以下命令:
$ java org.apache.mina.example.gettingstarted.timeserver.MinaTimeServer
这将启动服务器。现在telnet和看到程序的运行状况
发出以下命令telnet
telnet 127.0.0.1 9123
嗯,我们运行我们的第一个MINA程序。请尝试其他附带MINA作为例子的示例程序。
5、总结
在这一章,我们看着基于MINA的应用程序架构、客户端以及服务器。我们还实现了关于的TCP服务器/客户端,和UDP服务器和客户端的例子。
在接下来的章节我们将讨论MINA核心结构和高级的主题。
下一篇
[译]Apache MINA 2.0 第二章 基础知识
======================================================
欢迎转载,转载请保留出处!
注:看完以上内容,请通帖子底部的三种方式表达你此时的感受:赞、分享给你的小伙伴、发言给评价。你的支持,我的动力。
译者:
ヅ虫虫ゎ
翻译时间:2014-01-23 14:07
原译文: http://mina.apache.org/mina-project/userguide/ch1-getting-started/ch1-getting-started.html
======================================================
|