作者: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服务器
- package ch.chiqms.server;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.nio.charset.Charset;
- importorg.apache.mina.core.service.IoAcceptor;
- importorg.apache.mina.core.session.IdleStatus;
- importorg.apache.mina.filter.codec.ProtocolCodecFilter;
- importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;
- importorg.apache.mina.filter.logging.LoggingFilter;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
- public class MinaTimeServer {
- privatestatic final int PORT = 9123;
- publicstatic void main(String[] args){
- //监听连接的对象
- IoAcceptoracceptor = new NioSocketAcceptor();
- //配置过滤器
- //logger过滤器会输出所有的信息,例如新创建的会话、消息的接收、消息的发送、会话的关闭
- //codec过滤器会转换二进制活协议规定的数据为消息对象,这里是处理基于文本的消息
- acceptor.getFilterChain().addLast("logger",new LoggingFilter());
- acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(
- newTextLineCodecFactory(Charset.forName("UTF-8"))));
- //
- acceptor.setHandler(newTimeServerHandler());
- //设置输入缓冲区的大小和会话的IDLE熟悉
- acceptor.getSessionConfig().setReadBufferSize(2048);
- acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
- try{
- acceptor.bind(newInetSocketAddress(PORT));
- }catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
4、编写Time服务的Handler
- package ch.chiqms.server;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import org.apache.mina.core.service.IoHandlerAdapter;
- importorg.apache.mina.core.session.IdleStatus;
- importorg.apache.mina.core.session.IoSession;
- public class TimeServerHandler extendsIoHandlerAdapter {
- @Override
- publicvoid exceptionCaught(IoSession session, Throwable cause)
- throwsException {
- cause.printStackTrace();
- }
- @Override
- publicvoid messageReceived(IoSession session, Object message) throws Exception {
- Stringstr = message.toString();
- if(str.trim().equalsIgnoreCase("quit")){
- session.close(true);
- return;
- }
- Calendartime = Calendar.getInstance();
- SimpleDateFormatdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- session.write(df.format(time.getTime()));
- System.out.println("TimeMessage written...");
- }
- @Override
- publicvoid sessionIdle(IoSession session, IdleStatus status) throws Exception {
- System.out.println("IDLE"+session.getIdleCount(status));
- }
- }
5、运行MinaTimeServer
在命令行输入telnet 127.0.0.1 9123
服务器端的输出也可以看到:
- SLF4J: Failed to load class"org.slf4j.impl.StaticLoggerBinder".
- SLF4J: Defaulting to no-operation (NOP)logger implementation
- SLF4J: Seehttp://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
- Time Message written...
- Time Message written...
- 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句柄
写业务逻辑,处理不同的消息