`

Apache Mina 学习

 
阅读更多

由于刚刚接触mina,在网上看到这篇文章总结的不错,遂转载予以保存,在这里感谢原文作者。提供原文转载地址http://javaeyetodj.iteye.com/blog/856590

1.MINA 框架简介 
MINA (Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA 框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA 框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA 框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。 
MINA 框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。 

2.MINA 框架的常用类 
类NioSocketAcceptor用于创建服务端监听; 
类NioSocketConnector用于创建客户端连接; 
类IoSession用来保存会话属性和发送消息; 
类IoHandlerAdapter用于定义业务逻辑,常用的方法有: 
方法 定义 
sessionCreated() 当会话创建时被触发 
sessionOpened() 当会话开始时被触发 
sessionClosed() 当会话关闭时被触发 
sessionIdle() 当会话空闲时被触发 
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法 
messageRecieved() 当接收到消息后被触发

messageSent() 当发送消息后被触发

 

3.环境准备

  1. 首先到官方网站下载最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html 。下载之前先介绍一下 MINA 的两个版本:1.0.x 适合运行环境为 JDK1.4,1.1.x 适合 JDK1.5 的版本,两者的编译环境都需要 JDK1.5。JDK1.5 已经是非常普遍了,本文中使用 1.1.7 版本的 MINA,编译和运行所需的文件是 mina-core-1.1.7.jar。
  2. 下载 MINA 的依赖包 slf4j。MINA 使用此项目作为日志信息的输出,而 MINA 本身并不附带此项目包,请到http://www.slf4j.org/download.html 地址下载 slf4j 包,slf4j 项目解压后有很多的文件,本例中只需要其中的 slf4j-api-1.5.3.jar 和 slf4j-simple-1.5.3.jar 这两个 jar 文件。如果没有这两个文件就会导致启动例子程序的时候报 org/slf4j/LoggerFactory 类没找到的错误。
  3. 当然要求机器上必须装有 1.5 或者更新版本的 JDK。
  4. 最好你应该选择一个顺手的 Java 开发环境例如 Eclipse 或者 NetBeans 之类的,可以更方便的编码和调试,虽然我们的最低要求只是一个简单的文本编辑器而已。

4.编写代码并测试

 

Java代码 复制代码
  1. import java.io.IOException;   
  2. import java.net.InetSocketAddress;   
  3. import java.nio.charset.Charset;   
  4.   
  5. import org.apache.mina.common.ByteBuffer;   
  6. import org.apache.mina.common.IoAcceptor;   
  7. import org.apache.mina.common.SimpleByteBufferAllocator;   
  8. import org.apache.mina.filter.LoggingFilter;   
  9. import org.apache.mina.filter.codec.ProtocolCodecFilter;   
  10. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;   
  11. import org.apache.mina.transport.socket.nio.SocketAcceptor;   
  12. import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;   
  13.   
  14. public class MinaTimeServer {   
  15.   
  16.     private static final int PORT = 9123;   
  17.   
  18.     public static void main(String[] args) throws IOException {   
  19.         //设置buffer   
  20.         ByteBuffer.setUseDirectBuffers(false);   
  21.         ByteBuffer.setAllocator(new SimpleByteBufferAllocator());   
  22.         //定义acceptor   
  23.         IoAcceptor acceptor = new SocketAcceptor();   
  24.         //定义config   
  25.         SocketAcceptorConfig cfg = new SocketAcceptorConfig();   
  26.         //设置config,加入filter   
  27.         cfg.getSessionConfig().setReuseAddress( true );   
  28.         cfg.getFilterChain().addLast( "logger"new LoggingFilter() );   
  29.         cfg.getFilterChain().addLast( "codec"new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));   
  30.         //加入port handler cfg   
  31.         acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);   
  32.         System.out.println("MINA Time server started.");   
  33.     }   
  34. }   
Java代码  收藏代码
  1. import java.io.IOException;  
  2. import java.net.InetSocketAddress;  
  3. import java.nio.charset.Charset;  
  4.   
  5. import org.apache.mina.common.ByteBuffer;  
  6. import org.apache.mina.common.IoAcceptor;  
  7. import org.apache.mina.common.SimpleByteBufferAllocator;  
  8. import org.apache.mina.filter.LoggingFilter;  
  9. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  10. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  11. import org.apache.mina.transport.socket.nio.SocketAcceptor;  
  12. import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;  
  13.   
  14. public class MinaTimeServer {  
  15.   
  16.     private static final int PORT = 9123;  
  17.   
  18.     public static void main(String[] args) throws IOException {  
  19.         //设置buffer  
  20.         ByteBuffer.setUseDirectBuffers(false);  
  21.         ByteBuffer.setAllocator(new SimpleByteBufferAllocator());  
  22.         //定义acceptor  
  23.         IoAcceptor acceptor = new SocketAcceptor();  
  24.         //定义config  
  25.         SocketAcceptorConfig cfg = new SocketAcceptorConfig();  
  26.         //设置config,加入filter  
  27.         cfg.getSessionConfig().setReuseAddress( true );  
  28.         cfg.getFilterChain().addLast( "logger"new LoggingFilter() );  
  29.         cfg.getFilterChain().addLast( "codec"new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));  
  30.         //加入port handler cfg  
  31.         acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);  
  32.         System.out.println("MINA Time server started.");  
  33.     }  
  34. }   
 
Java代码 复制代码
  1. import java.util.Date;   
  2.   
  3. import org.apache.mina.common.IdleStatus;   
  4. import org.apache.mina.common.IoHandlerAdapter;   
  5. import org.apache.mina.common.IoSession;   
  6. import org.apache.mina.common.TransportType;   
  7. import org.apache.mina.transport.socket.nio.SocketSessionConfig;   
  8.   
  9. public class TimeServerHandler extends IoHandlerAdapter {   
  10.     public void exceptionCaught(IoSession session, Throwable t) throws Exception {   
  11.         t.printStackTrace();   
  12.         session.close();   
  13.     }   
  14.   
  15.     public void messageReceived(IoSession session, Object msg) throws Exception {   
  16.         String str = msg.toString();   
  17.         //如果是quit就关闭session退出   
  18.         if( str.trim().equalsIgnoreCase("quit") ) {   
  19.             session.close();   
  20.             return;   
  21.         }   
  22.         //否则打印当前日期   
  23.         Date date = new Date();   
  24.         session.write( date.toString() );   
  25.         String ip = session.getRemoteAddress().toString();   
  26.         System.out.println("===> Message From " + ip +" : " + msg);   
  27.         session.write("Hello " + msg);   
  28.     }   
  29.   
  30.     public void sessionCreated(IoSession session) throws Exception {   
  31.         System.out.println("Session created");   
  32.   
  33.         if( session.getTransportType() == TransportType.SOCKET )   
  34.             ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );   
  35.   
  36.         session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );   
  37.     }   
  38.        
  39.       
  40.   
  41. }  
Java代码  收藏代码
  1. import java.util.Date;  
  2.   
  3. import org.apache.mina.common.IdleStatus;  
  4. import org.apache.mina.common.IoHandlerAdapter;  
  5. import org.apache.mina.common.IoSession;  
  6. import org.apache.mina.common.TransportType;  
  7. import org.apache.mina.transport.socket.nio.SocketSessionConfig;  
  8.   
  9. public class TimeServerHandler extends IoHandlerAdapter {  
  10.     public void exceptionCaught(IoSession session, Throwable t) throws Exception {  
  11.         t.printStackTrace();  
  12.         session.close();  
  13.     }  
  14.   
  15.     public void messageReceived(IoSession session, Object msg) throws Exception {  
  16.         String str = msg.toString();  
  17.         //如果是quit就关闭session退出  
  18.         if( str.trim().equalsIgnoreCase("quit") ) {  
  19.             session.close();  
  20.             return;  
  21.         }  
  22.         //否则打印当前日期  
  23.         Date date = new Date();  
  24.         session.write( date.toString() );  
  25.         String ip = session.getRemoteAddress().toString();  
  26.         System.out.println("===> Message From " + ip +" : " + msg);  
  27.         session.write("Hello " + msg);  
  28.     }  
  29.   
  30.     public void sessionCreated(IoSession session) throws Exception {  
  31.         System.out.println("Session created");  
  32.   
  33.         if( session.getTransportType() == TransportType.SOCKET )  
  34.             ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );  
  35.   
  36.         session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );  
  37.     }  
  38.       
  39.      
  40.   
  41. }  

 

 

启动服务器后,打开命令行窗口,输入 telnet localhost 9123 后,输入字符后回车,可以看到client端的字符串在服务器端被打印出来,该程序成功执行

 

 

 

5.架构认识

程序中IoService 是应用程序的入口,相当于我们前面代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口,相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。

而IoHandler是业务处理模块。相当于前面例子中的 HelloHandler 类。在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。

一个 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文档):

 

void exceptionCaught (IoSession session, Throwable cause) 
                   当接口中其他方法抛出异常未被捕获时触发此方法
void messageReceived (IoSession session, Object message) 
                   当接收到客户端的请求信息后触发此方法.
void messageSent (IoSession session, Object message) 
                   当信息已经传送给客户端后触发此方法.
void sessionClosed (IoSession session) 
                   当连接被关闭时触发,例如客户端程序意外退出等等.
void sessionCreated (IoSession session) 
                   当一个新客户端连接后触发此方法.
void sessionIdle (IoSession session, IdleStatus status) 
                   当连接空闲时触发此方法.
void sessionOpened (IoSession session) 
                   当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发

前面我们提到 IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一个用途却是必须的,那就是作为 IoService 和 IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,我们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在 messageReceived 中直接将 msg 对象强制转换成 String 对象。

而如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得 IoHandler 不只是业务处理,还得充当协议解析的任务。

MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。

分享到:
评论
1 楼 白天看黑夜 2017-10-20  
Apache Mina Server 2.0 中文参考手册(带目录),有需要的自己下载吧
http://www.itmayun.com/it/files/226631678709806/resource/484719910403706/1.html

相关推荐

    apache Mina的完整学习资料

    apache mina的入门完整学习资料,附加中文参考手册。

    apache mina 学习笔记三(子项目FtpServer)

    NULL 博文链接:https://tangmingjie2009.iteye.com/blog/2036903

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache mina2学习笔记DEMO

    这个是我学的apache mina2.0学习笔记的实例

    apache mina 中文版 学习资料(很详细的哟)

    很详细的描述了apache mina 框架,对于那些对于英文不是很懂得人,这简直就是福音啊,哈哈

    apache-mina-2.0.4架包及源码各pdf学习教程

    apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...

    Apache Mina 2 完全自学手册

    Apache Mina 2 完全自学手册

    Apache mina源代码框架解析

    写这篇文档主要是想对刚接触Mina的人讲解一些Mina的基本知识,由浅入深,一步一步的学习Mina思想的精髓。这里只是简单的涉及一点,不会对其做很深入的探讨。但是Mina的服务器和客户端在很大的程度上都是一样,所以...

    Apache MINA使用案例源代码

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的...

    Apache Mina Server 2.0 参考手册

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    Apache Mina Server 2.0 中文参考手册

    帮助你快速学习Mina框架,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信框架。Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用。

    MINA学习资料大全

    MINA开发文档总结,有如下内容Apache_Mina_Server_2.0中文参考手册V1.0.pdf 深入理解Apache_Mina.pdf MINA2官方教程翻译.pdf Mina2源码分析.pdf

    Apache_Mina2.0学习笔记

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 引言 1 一. Mina入门 2 第一步.下载使用的Jar包 2 第二步.工程创建配置 2 第三步.服务端程序 3 第四步.客户端程序 6 第五步.长...

    mina 框架学习文档

    apache mina 框架的学习文档,通过此文档可以基本了解mina框架。

    Apache Mina2 整理资料

    MINA-2.0.0-M4.chm(英文)中文的实在是没有)+Mina2.0学习笔记(修订版).doc+Apache_Mina_Server_2.0中文参考手册V1.0.pdf+MINA框架新人指南.pdf

    一个Apache MINA使用案例源代码

    摘要:Java源码,网络相关,Apache 一个Apache MINA使用案例源代码,消息接收的例子,显示接收到的消息,通过这个例子你可以学习一下会话创建、打开会话,与sessionCreated最大的区别是它是从另一个线程处调用的、会话...

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...

    Apache_Mina.rar

    各种Apache_Mina的学习资料,非常全,可以下下来好好看

    深入理解Apache_Mina

    深入理解Apache_Mina,超值学习包。

Global site tag (gtag.js) - Google Analytics