Apache Mina开发手册

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

一、介绍

Apache Mina是一个网络应用框架,简化用户开发高性能、高可扩展性的网络应用程序的难度。Mina提供了一个抽象的事件驱动的异步API,通过Java NIO实现各种传输协议如TCP/IP和UDP/IP。


Apache Mina经常用作:

1)NIO框架库

2)客户端/服务器通信框架库

3)网络Socket通信库

 

Apache Mina还伴随有不少子项目:

1)Asyncweb

构建于Apache Mina异步框架之上的HTTP服务器

2)FtpServer

一个FTP服务器

3)SSHd

一个Java库,支持SSHH协议

4)Vysper

一个XMPP服务器


二、Apache Mina下载

下载最新的Mina v2.0.8版

地址见:http://mina.apache.org/mina-project/downloads.html


三、用Mina开发时间服务器

说明一下,其实是基于官方的例子,略作了修改,因为发现官方的例子太陈旧,甚至包含了deprecated的方法。

 

1、先决条件

Apache Mina 2.0.8 Core

JDK 7

SLF4J+LOGBACK

 

2、项目依赖包

mina-core-2.0.8.jar

slf4j-api-1.6.6.jar



3、编写基于Mina的Time服务器

[java]  view plain copy print ?
  1. package ch.chiqms.server;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.InetSocketAddress;  
  5. import java.nio.charset.Charset;  
  6.    
  7. importorg.apache.mina.core.service.IoAcceptor;  
  8. importorg.apache.mina.core.session.IdleStatus;  
  9. importorg.apache.mina.filter.codec.ProtocolCodecFilter;  
  10. importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  11. importorg.apache.mina.filter.logging.LoggingFilter;  
  12. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  13.    
  14. public class MinaTimeServer {  
  15.          privatestatic final int PORT = 9123;  
  16.          publicstatic void main(String[] args){  
  17.                    //监听连接的对象  
  18.                    IoAcceptoracceptor = new NioSocketAcceptor();  
  19.                     
  20.                    //配置过滤器  
  21.                    //logger过滤器会输出所有的信息,例如新创建的会话、消息的接收、消息的发送、会话的关闭  
  22.                    //codec过滤器会转换二进制活协议规定的数据为消息对象,这里是处理基于文本的消息  
  23.                    acceptor.getFilterChain().addLast("logger",new LoggingFilter());  
  24.                    acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(  
  25.                                      newTextLineCodecFactory(Charset.forName("UTF-8"))));  
  26.                    
  27.                    //  
  28.                    acceptor.setHandler(newTimeServerHandler());  
  29.                     
  30.                    //设置输入缓冲区的大小和会话的IDLE熟悉  
  31.                    acceptor.getSessionConfig().setReadBufferSize(2048);  
  32.                    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);  
  33.                     
  34.                    try{  
  35.                             acceptor.bind(newInetSocketAddress(PORT));  
  36.                    }catch (IOException e) {  
  37.                             e.printStackTrace();  
  38.                    }  
  39.          }  
  40. }  

4、编写Time服务的Handler

[java]  view plain copy print ?
  1. package ch.chiqms.server;  
  2.    
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Calendar;  
  5.    
  6. import org.apache.mina.core.service.IoHandlerAdapter;  
  7. importorg.apache.mina.core.session.IdleStatus;  
  8. importorg.apache.mina.core.session.IoSession;  
  9.    
  10. public class TimeServerHandler extendsIoHandlerAdapter {  
  11.    
  12.          @Override  
  13.          publicvoid exceptionCaught(IoSession session, Throwable cause)  
  14.                             throwsException {  
  15.                    cause.printStackTrace();  
  16.          }  
  17.    
  18.          @Override  
  19.          publicvoid messageReceived(IoSession session, Object message) throws Exception {  
  20.                    Stringstr = message.toString();  
  21.                    if(str.trim().equalsIgnoreCase("quit")){  
  22.                             session.close(true);  
  23.                             return;  
  24.                    }  
  25.                    Calendartime = Calendar.getInstance();  
  26.                    SimpleDateFormatdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  27.                    session.write(df.format(time.getTime()));  
  28.                    System.out.println("TimeMessage written...");  
  29.          }  
  30.    
  31.          @Override  
  32.          publicvoid sessionIdle(IoSession session, IdleStatus status) throws Exception {  
  33.                    System.out.println("IDLE"+session.getIdleCount(status));  
  34.          }  
  35.    
  36. }  

5、运行MinaTimeServer

在命令行输入telnet 127.0.0.1 9123



服务器端的输出也可以看到:

[javascript]  view plain copy print ?
  1. SLF4J: Failed to load class"org.slf4j.impl.StaticLoggerBinder".  
  2. SLF4J: Defaulting to no-operation (NOP)logger implementation  
  3. SLF4J: Seehttp://www.slf4j.org/codes.html#StaticLoggerBinder for further details.  
  4. Time Message written...  
  5. Time Message written...  
  6. Time Message written...  


四、NIO概述

NIO API是Java 1.4版引入的,NIO的意思是非阻塞的I/O通信。
要知道Mina的NIO是基于NIO-1开发的,而在JDK 7中引入了NIO-2的库,但Mina还没有从NIO-2中获得各方面的提升,因此Mina还是基于NIO-1的。
虽然Oracle官方是把NIO的N作为New的解释,但业界普遍把这个N解释为Non-Blocking。

Mina目前分为1.x和2.x两个主要版本,两个版本的主要区别在于1.x使用传统I/O方式,而2.x使用NIO方式。由于NIO是无阻塞的,而传统IO是阻塞的,所以2.x版本性能会有所提高。但是由于NIO比传统IO更加难于理解,实现更加复杂,想自己开发基于NIO的高性能服务器难度较大,所以这也是选择Mina框架的原因。
Mina 3.x目前还在开发阶段,到时候会通过NIO-2进一步提升通信性能。

java.nio.*包中包含了几个关键的结构:
1)Buffer:数据的容器
2)Charset:字节和Unicode编码的容器转换器
3)Channel:封装了I/O操作的实体的连接表现
4)Selector:提供了可选择的、多分复用的非阻塞I/O
5)Regexps:提供了一些操作正则表达式的工具

使用Mina的优点:
1)隐藏了开发网络程序的复杂性,提供了统一的编程接口;
- 用Java NIO实现TCP/IP和UDP/IP通信
- 用RXTX实现RS232串口通信
- VM级的管道通信
- 实现自己的传输协议

2)与Servlet相似的过滤器接口,支持扩展

3)低层和高层API
- 低层:使用字节缓冲ByteBuffer
- 高层:使用用户定义的消息对象和编码

4)高可定制的线程模型
- 单线程
- 单个线程池
- 多个线程池(即SEDA)

5)通过Java 5的SSLEngine实现开箱即用的SSL、TLS和StartTLS

6)过载防护与流量限制

7)使用mock对象使用单元可测试性

8)JMX管理能力

9)通过StreamIoHandler支持流I/O

10)可与PicoContainer或Spring框架相集成

11)可从Mina 1.x和Netty平滑迁移

五、Mina应用程序架构

1、基于Mina应用程序的架构

基于Mina的应用程序的架构通常是这样的:


可以看出,Mina是应用程序和网络层之间的胶水层,可以通过Mina完成TCP、UDP通信,甚至是串口RS-232C通信。Mina屏蔽了网络编程的复杂性,你只需专心于处理业务逻辑。

下面我们继续深入Mina框架:


广义上来讲,基于Mina的应用程序可以划分为三层:

1)I/O Service:I/O服务,执行实际的I/O通信。
2)I/O Filter Chain:I/O过滤器链,把字节过滤/转换成所需的数据结构,反之亦然。
3)I/O Handler:I/O句柄,放置实际的业务逻辑。

因此,要想创建基于Mina的应用程序,你必须:

1)创建I/O服务
可选择已有的服务(*Acceptor)或创建自己的I/O服务。

2)创建过滤器链
可选择已有的过滤器或创建自定义的过滤器,用于转换请求/响应的数据

3)创建I/O句柄
写业务逻辑,处理不同的消息



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值