MINA2官方教程翻译.doc

上传人:sk****8 文档编号:3534200 上传时间:2019-06-02 格式:DOC 页数:25 大小:293.50KB
下载 相关 举报
MINA2官方教程翻译.doc_第1页
第1页 / 共25页
MINA2官方教程翻译.doc_第2页
第2页 / 共25页
MINA2官方教程翻译.doc_第3页
第3页 / 共25页
MINA2官方教程翻译.doc_第4页
第4页 / 共25页
MINA2官方教程翻译.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、MINA2 官方教程翻译 (1) 2.x 与 1.x 的变化文章分类: Java 编程一、包与命名所有的类和方法严格使用驼峰法命名。例如 SSLFilter 被更名为 SslFilter,其它很多类也是如此。所有 NIO 传输类在命名时增加Nio前缀。因为 NIO 并不只是 socket/datagram 传输的实现,所有Nio前缀加在了所有的 NIO 传输类上。改变之前:Java 代码 1. SocketAcceptor acceptor = new SocketAcceptor(); 改变之后:Java 代码 1. SocketAcceptor acceptor = new NioSock

2、etAcceptor(); Filter 类被重新整理进多重子包内。随着框架自带的 filter 实现的数量的增加,所有的 filter 都被移动到适当的子包中( 例如,StreamWriteFilter 移至 org.apache.mina.filter.stream)。*.support 的所有包被移动到了其父包(或者其他包)中。为了避免循环依赖,*.support 包中的所有类都被移至其父包或者其他包中。你可以在 IDE(例如Eclipse)中简单的修正这些包的导入从而避免编译错误。二、BuffersMINA ByteBuffer 被重命名为 IoBuffer。因为 MINA ByteB

3、uffer 与 JDK 中 NIO ByteBuffer 同名,很多用户发现与其组员沟通时存在很多困难。根据用户的反馈,我们将 MINA ByteBuffer 重命名为 IoBuffer,这不仅使类名称简化,也是类名称更加明晰。放弃 Buffer 池,默认使用 IoBuffer.allocate(int)来分配 heap buffer。 acquire()与 release()两个方法将不再是容易发生错误的。如果你愿意,你可以调用free()方法,但这是可选的。请自己承担使用这个方法的风险。 在大多数 JVM 中,框架内置的 IoBuffer 性能更加强劲、稳定。Direct buffer 池

4、是 MINA 早期版本所标榜的众多特性之一。然而根据当今的尺度,在主流的JVM 中 direct buffers 的表现要比 heap buffers 差。此外,当 direct buffer memory 的最大值没有被正确设定时,不可预期的 OutOfMemoryError 也经常出现。为了使系统内置的 IoBuffer 性能更加强劲、稳定, Apache MINA 项目组将默认的 buffer 类型由direct 改为 heap。因为 heap buffers 并不需要池化,PooledByteBufferAllocator 也被移除掉了。由于没有了池的概念,ByteBuffer.acq

5、uire() 和 ByteBuffer.release()也被移除掉了。然而,如果使用的速度太快,分配 heap buffers 也会成为瓶颈。这是因为分配字节数据如要将所有的元素都置为 0,这个操作是消耗内存带宽的。CachedBufferAllocator 是针对这种情况使用的,但是在大多数情况下,你还是应该使用默认的 SimpleBufferAllocator。三、启动和配置IoService 的配置被简化了。在 1.x 版本中,有很多种方式来配置 IoService 和它的子接口( 例如 IoAcceptor 和 IoConnector)。基本上,有两种配置方法:在调用 bind()

6、或 connect()时,具体指定一个 IoServiceConfigJava 代码 1. SocketAcceptor acceptor = new SocketAcceptor(); 2. SocketAcceptorConfig myServiceConfig = new SocketAcceptorConfig(); 3. myServiceConfig.setReuseAddress(true); 4. acceptor.bind(myHandler, myServiceConfig); 使用 IoService.defaultConfig 属性,此时不需要指定一个 IoServic

7、eConfigJava 代码 1. SocketAcceptor acceptor = new SocketAcceptor(); 2. acceptor.getDefaultConfig().setReuseAddress(true); 3. acceptor.bind(new InetSocketAddress(8080), myHandler); 配置 IoFilterChain 是另一个令人头痛的问题,因为除了 IoServiceConfig 内的IoFilterChainBuilder 外,还有一个全局的 IoFilterChainBuilder,这就意味着使用两个IoFilterC

8、hainBuilders 来配置一个 IoFilterChain。大多数用户使用全局的 IoFilterChainBuilder来配置 IoFilterChain,并且这就足够了。针对这种复杂情况,MINA 2.0 简化了网络应用程序的启动,请比较下面的代码与前面代码的不同Java 代码 1. SocketAcceptor acceptor = new SocketAcceptor(); 2. acceptor.setReuseAddress(true); 3. acceptor.getFilterChain().addLast(“myFilter1“, new MyFirstFilter()

9、;4. acceptor.getFilterChain().addLast(“myFilter2“, new MySecondFilter(); 5. acceptor.getSessionConfig().setTcpNoDelay(true); 6. 7. / You can specify more than one addresses to bind to multiple addresses or interface cards. 8. acceptor.setLocalAddress(new InetSocketAddress(8080); 9. acceptor.setHandl

10、er(myHandler); 10. 11.acceptor.bind(); 12. 13./ New API restricts one bind per acceptor, and you cant bind morethan once. 14./ The following statement will raise an exception. 15.acceptor.bind(); 你也许意识到与 Spring 框架整合也将变得更加简单。四、线程ThreadModel 被移除了。最初引入 ThreadModel 的概念为的是简化一个 IoService 预定义的线程模式。然而,配置线程模

11、式却变得非常简单以至于不能引入新的组建。与其易用性相比,线程模式带了更多的混乱。在 2.x 中,当你需要的时候,你必须明确的增加一个 ExecutorFilter。ExecutorFilter 使用一个特定的 Executor 实现来维系事件顺序。在 1.x 中,可以使用任意的 Executor 实现来来维系事件顺序,但 2.x 提供了两个新的ThreadPoolExecutor 实现,OrderedThreadPoolExecutor 和UnorderedThreadPoolExecutor,ExecutorFilter 维系事件顺序,当以下两种情况:当使用默认构造方法时,ExecutorF

12、ilter 创建一个 OrderedThreadPoolExecutor,或者 明确指明使用 OrderedThreadPoolExecutor 时OrderedThreadPoolExecutor 和 UnorderedThreadPoolExecutor 内部使用了一些架构来防止发生 OutOfMemoryError,所以你应该尽量使用这两个类而不是其他 Executor 的实现。五、协议编解码DemuxingProtocolCodecFactory 被重写了。新增了 DemuxingProtocolEncoder 和 DemuxingProtocolDecoder 两个类,Demuxin

13、gProtocolCodecFactory 只是这两个类的外壳。register() 方法被重命名为addMessageEncoder() 和 addMessageDecoder(),这个变化使混合使用多个 encoders 和decoders 变得更加自由。MessageEncoder 接口也发生了改变, MessageEncoder.getMessageTypes()被移除了,当你调用 addMessageEncoder(),你只需要指明信息的类型, encoder 就可以进行正确的编码了。六、集成JMX 集成被重新设计了。Sping 集成被简化了。七、其他方面的改变TransportTy

14、pe 更名为 TransportMetadata。TransportType 改名是因为它的角色是元数据而不仅仅是一种枚举。IoSessionLogger 被重新设计了。IoSessionLogger 现在实现了 SLF4J Logger 接口,所以你可以像声明简单 SLF4J logger 实例一样声明它,这个变化使你不必向其他不必要的部分暴露 IoSessionLogger 对象。另外,在使用 MDC 时,请考虑使用简单的 MdcInjectionFilter,这时 IoSessionLogger 是没有必要的。改变之前:Java 代码 1. IoSessionLogger.debug(s

15、ession, .); 改变之后:Java 代码 1. Logger logger = IoSessionLogger.getLogger(session); 2. logger.debug(.); BroadcastIoSession 被合并到 IoSession 中。ReadThrottleFilterBuilder 被 ReadThrottleFilter 替代并最终移除。MINA2 官方教程翻译 (2) 快速上手指南一、介绍该教程通过构建一个 time server,带你走进给予 MINA 的应用程序开发的大门,但在开始之前我们需要具备下面的必要条件: MINA 2.x 的核心包 JD

16、K 1.5 或更高版本 SLF4J 1.3.0 或更高版本1. Log4J 1.2 的用户:slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x2. Log4J 1.3 的用户:slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x3. java.util.logging 的用户:slf4j-api.jar and slf4j-jdk14.jar注意:请务必确认你所使用的 slf4j-*.jar 要与你的日志框架相匹配。例如,slf4j-log4j12.jar 和 log4j-1.3.x.jar 不能在一

17、起使用,否则会引起混乱。我已经在 Windows? 2000 professional 和 linux 平台上测试了这个程序,如果你在运行这个程序的过程中遇到了问题,请立即联系我们的开发人员。当然,这个程序是与开发环境(IDE, editors 等等)无关的,它可以在任何你熟悉的平台中运行。另外,为了简化,编译命令与运行脚本都没有体现,如果你需要学习如何编译并运行 java 程序,请参考 Java tutorial。二、编写基于 MINA 框架的 time server我们从创建一个名为 MinaTimeServer.java 的文件开始,最初的代码如下:Java 代码 1. public c

18、lass MinaTimeServer 2. 3. public static void main(String args) 4. / code will go here next 5. 6. 对所有人来说,这段代码应该是简单易懂的,我们只是简单的定义了一个 main 方法是这个程序能够正常运行起来。从现在开始,我们将逐步加入代码是其最终成为一个可用的 server。首先,我们需要一个可以监听连接到来的对象,既然我们的程序是基于 TCP/IP 的,所以我们在程序中加入一个 SocketAcceptor。Java 代码 1. import org.apache.mina.core.service

19、.IoAcceptor; 2. import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 3. 4. public class MinaTimeServer 5. 6. 7. public static void main( String args ) 8. 9. IoAcceptor acceptor = new NioSocketAcceptor(); 10. 11. 12. 加入 NioSocketAcceptor 之后,我们可以继续定义一个 handler 类,并将其与NioSocketAcceptor 绑定到一个端口

20、上。下面,我们在配置中增加一个 filter,这个 filter 将把二进制数据或是协议相关的数据转换成为一个消息对象,反之亦然。我们使用现有的 TextLine 工厂类,以为它可以处理基于文本的信息(你不需要自己来实现编解码部分)。Java 代码 1. import java.nio.charset.Charset; 2. 3. import org.apache.mina.core.service.IoAcceptor; 4. import org.apache.mina.filter.codec.ProtocolCodecFilter; 5. import org.apache.mina

21、.filter.codec.textline.TextLineCodecFactory; 6. import org.apache.mina.filter.logging.LoggingFilter; 7. import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 8. 9. public class MinaTimeServer 10. 11. public static void main( String args ) 12. 13. IoAcceptor acceptor = new NioSocketAcceptor(

22、); 14. 15. acceptor.getFilterChain().addLast( “logger“, new LoggingFilter() ); 16. acceptor.getFilterChain().addLast( “codec“, new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( “UTF-8“ ); 17. 18. 然后,我们定义一个 handler,这个 handler 将对客户端的连接以及过去当前时间的请求做出服务。handler 类必须实现 IoHandler 接口。对于大多数基

23、于 MINA 的应用程序,这个操作无疑是一个很大的负担,因为它将处理客户端说有的请求。在这个教程中,我们的 handler 将继承自IoHandlerAdapter,这个类依照适配器模式来简化实现 IoHandler 接口所带来的代码量。Java 代码 1. import java.io.IOException; 2. import java.nio.charset.Charset; 3. 4. import org.apache.mina.core.service.IoAcceptor; 5. import org.apache.mina.filter.codec.ProtocolCodec

24、Filter; 6. import org.apache.mina.filter.codec.textline.TextLineCodecFactory; 7. import org.apache.mina.filter.logging.LoggingFilter; 8. import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 9. 10.public class MinaTimeServer 11. 12. public static void main( String args ) throws IOException

25、13. 14. IoAcceptor acceptor = new NioSocketAcceptor(); 15. 16. acceptor.getFilterChain().addLast( “logger“, new LoggingFilter() ); 17. acceptor.getFilterChain().addLast( “codec“, new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( “UTF-8“ ); 18. 19. acceptor.setHandler( new TimeServe

26、rHandler() ); 20. 21. 现在,我们在 NioSocketAcceptor 增加一些 Socket 相关的配置:Java 代码 1. import java.io.IOException; 2. import java.nio.charset.Charset; 3. 4. import org.apache.mina.core.session.IdleStatus; 5. import org.apache.mina.core.service.IoAcceptor; 6. import org.apache.mina.filter.codec.ProtocolCodecFil

27、ter; 7. import org.apache.mina.filter.codec.textline.TextLineCodecFactory; 8. import org.apache.mina.filter.logging.LoggingFilter; 9. import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 10. 11.public class MinaTimeServer 12. 13. public static void main( String args ) throws IOException 14

28、. 15. IoAcceptor acceptor = new NioSocketAcceptor(); 16. 17. acceptor.getFilterChain().addLast( “logger“, new LoggingFilter() ); 18. acceptor.getFilterChain().addLast( “codec“, new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( “UTF-8“ ); 19. 20. acceptor.setHandler( new TimeServerH

29、andler() ); 21.idle sessions 22. acceptor.getSessionConfig().setReadBufferSize( 2048 ); 23. acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); 24. 25. 在 MinaTimeServer 增加了两行新的内容,这些 set 方法分别设置了 IoHandler、input buffer size 和 session 对象上的 idle 属性。buffer size 指明了底层操作系统应该给与新到来的数据分配多少空间;

30、第二行指明了什么时候应该检测 idle sessions。在 setIdleTime 这个方法中,第一参数指明了在检测 session 是否 idle 时,应该关心那一种活动,第二个参数指明了 session变为 idle 状态时需要经过多长的时间。handler 的代码如下:Java 代码 1. import java.util.Date; 2. 3. import org.apache.mina.core.session.IdleStatus; 4. import org.apache.mina.core.service.IoHandlerAdapter; 5. import org.ap

31、ache.mina.core.session.IoSession; 6. 7. public class TimeServerHandler extends IoHandlerAdapter 8. 9. Override 10. public void exceptionCaught( IoSession session, Throwable cause ) throws Exception 11. 12. cause.printStackTrace(); 13. 14. 15. Override 16. public void messageReceived( IoSession sessi

32、on, Object message )throws Exception 17. 18. String str = message.toString(); 19. if( str.trim().equalsIgnoreCase(“quit“) ) 20. session.close(); 21. return; 22. 23. 24. Date date = new Date(); 25. session.write( date.toString() ); 26. System.out.println(“Message written.“); 27. 28. 29. Override 30.

33、public void sessionIdle( IoSession session, IdleStatus status ) throws Exception 31. 32. System.out.println( “IDLE “ + session.getIdleCount( status ); 33. 34. 该类用到的方法有 exceptionCaught、messageReceived 和 sessionIdle。在 handler 中,一定要定义 exceptionCaught 方法,该方法用来处理在远程连接中处理过程中发生的各种异常,如果这个方法没有被定义,我们可能不能发现这些异

34、常。在这个 handler 中,exceptionCaught 方法只是简单地打印出异常堆栈信息并关闭连接,对于大多数程序来说,这是一种比较标准的操作,除非连接可以在异常条件下恢复。messageReceived 方法会接收客户端的数据并返回当前的的系统时间,如果从客户端接收到了消息quit,则 session 会被关闭。与调用 session.write(Object)的情况相同,不同的协议编解码器决定了传入该方法的对象(第二个参数)也是不同的。如果你没有指定协议编解码器,你最有可能接收到一个 IoBuffer 对象,当然,调用 session.write(Object)也是一个 IoBuf

35、fer 对象。当 session 持续 idle 的时间与 acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 )设置的时间一致时,sessionIdle 方法将被调用。现在剩下的工作只是定义一个 server 监听的地址和端口了,当然还需要启动服务。代码如下:正如你所见,这里调用了 acceptor.setLocalAddress( new InetSocketAddress(PORT) );方法,该方法指明了 server 将在哪个 IP 和端口上监听。最后一步调用了 IoAcceptor.bind()方法,该

36、方法将端口与具体的客户端进程绑定在一起。三、验证 Time server现在,我们编译上面的程序,编译完成后就可以运行并查看运行结果了。最简单的测试途径就是启动程序,并使用 telnet 与之建立连接:Client Output Server Outputusermyhost: telnet 127.0.0.1 9123 Trying 127.0.0.1. Connected to 127.0.0.1. Escape character is . hello Wed Oct 17 23:23:36 EDT 2007 quit Connection closed by foreign host.

37、 usermyhost:MINA Time server started. Message written.四、接下来获取更多资源,请浏览 MINA 的 Documentation。你也可以阅读其他教程。MINA2 官方教程翻译 (3) MINA 的应用程序架构文章分类: Java 编程一、简介有个问题经常被提出:基于 MINA 的应用程序应该是什么样的呢?这篇文章将给出一个答案。我们已经收集了很多基于 MINA 的描述信息。下面是架构图:让我们在来关于一下细节这张图片选取自 Trustin Lee 在 JavaOne 2008 上的报告“Rapid Network Application D

38、evelopment with Apache MINA“从广义上讲,基于 MINA 的应用程序分为 3 层 I/O Service - 完成实际的 I/O 操作 I/O Filter Chain - 将字节过滤或转换成为预想的数据结构,反之亦然 I/O Handler - 完成实际的业务逻辑操作那我们如何创建一个基于 MINA 的应用程序呢?1. Create I/O service - 从现有的 Services (*Acceptor)中选择一个或者创建自己的 2. Create Filter Chain - 从现有的 Filters 中选择或者创建一个传输 request/response 的自定义 Filter3. Create I/O Handler - 编写业务逻辑, 处理不同的报文创建 MINA 程序就如上文所述的一样。MINA2 官方教程翻译 (4) 日志配置一、背景MINA 框架允许开发人员在编写基于 MINA 的应用程序时使用自己熟悉的日志系统。二、SLF4JMINA 框架使用 Simple Logging Facade for Java (SLF4J)。你可以在 这里 获取到更多关于SLF4J 的信息,这种日志系统兼容各种日志系统的实现。你可能会使用 log4j、java.util.logging

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。