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

4、编写Time服务的Handler

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

5、运行MinaTimeServer

在命令行输入telnet 127.0.0.1 9123

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

[javascript] view plaincopyprint?
  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句柄
写业务逻辑,处理不同的消息

Apache Mina开发手册相关推荐

  1. 使用 Apache MINA 开发高性能网络应用程序

    http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/ Apache MINA(Multipurpose Infrastructur ...

  2. 【Apache Mina2.0开发之一】搭建Apache Mina框架并实现Server与Client端消息传递

    Hibernate系列学习阶段到此结束了,那么紧接着进入Apache Mina的开发学习,很多童鞋在微薄和QQ中疑问Himi为什么突然脱离游戏开发了,嘿嘿,其实可能更多的童鞋已经看出来了,Himi在偏 ...

  3. 【Apache Mina2.0开发之一】搭建Apache Mina框架并实现Server与Client端的简单消息传递!

    Hibernate系列学习阶段到此结束了,那么紧接着进入Apache Mina的开发学习,很多童鞋在微薄和QQ中疑问Himi为什么突然脱离游戏开发了,嘿嘿,其实可能更多的童鞋已经看出来了,Himi在偏 ...

  4. 搭建Apache Mina框架并实现Server与Client端的简单消息传递

    http://www.himigame.com/apache-mina/831.html :(作者新浪微博: @李华明Himi ) 转载自[黑米GameDev街区] 原文链接: http://www. ...

  5. Apache Mina v2.0.8 API手册

    Apache Mina v2.0.8 API手册 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 我自己制作了一份<Apache Mina v2.0 ...

  6. 作者谈《阿里巴巴Java开发手册(规约)》背后的故事

    1.前言 距离<阿里巴巴Java开发手册(规约)>(下称<手册>)对外正式发布已经1年多了.在过去的3日子里,这本小小的手册在业界产生了巨大的影响力.值此一周年之际,我们不妨一 ...

  7. Apache Mina 介绍

    为什么80%的码农都做不了架构师?>>>    1.MINA 框架简介 下图为本人根据对MINA的简要理解,所画出来的框架简图: Apache MINA 是一个网络应用框架,有助于用 ...

  8. 全新出击!《Java开发手册(嵩山版)》解读手册升级下载

    简介:<〈Java开发手册(嵩山版)〉灵魂15问>重磅来袭!"一线大厂如何用Java"解读再升级,千万阅读量博主深究Java规约背后的原理.规范学好Java还不来看一看 ...

  9. Java开发手册——嵩山版(清幽现云山,虚静出内功)

    终于找到了--阿里巴巴Java开发手册1.7.0(嵩山版) 前言 <Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一 线实战的检验及不断完善,公开到业 ...

最新文章

  1. StackOverFlow上你没看过的7个Java最佳答案
  2. 从模板方法模式到JDBCTemplate
  3. springboot rocket 多个生产者_RabbiMQ原理与SpringBoot使用
  4. python可以修图吗_会照片处理的不只是ps,还有Python!
  5. c++画多边形_水彩画,这么美!怎么画出来的?
  6. Docker搭建NSQ实时分布式消息集群
  7. 【做题记录】CF1444A Division
  8. 小甲鱼python全部视频_小甲鱼全套教程之Python系列视频教程
  9. java校验邮箱_Java正则表达式校验邮箱和手机号 | 学步园
  10. Stack Overflow 2017 开发者调查报告(程序员必看)
  11. 特征值_特征值和奇异值的关系是什么?
  12. mysql修复表命令_mysql命令修复数据库表
  13. STM32——电容触摸按键实验
  14. 大咖云集 共享国际开源盛宴「第十三届开源中国开源世界高峰论坛」在京成功举办...
  15. visio双线方框怎么画_用VISIO怎样画出扇形
  16. 【机器学习笔记】【随机森林】【回归器】【填充缺失值】
  17. 揭秘:带你玩转陪玩圈,潮流玩法轻松赚钱
  18. 2017年最后一篇文章:微信小程序游戏跳一跳刷榜原理解析!
  19. 关于Java对接读卡器遇到的坑Process finished with exit code -1073740940 (0xC0000374)
  20. 数字签名与数字证书技术简介(一)

热门文章

  1. 【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 )
  2. python基础教程:包的创建及导入
  3. LeetCode03:无重复字符的最长子串
  4. 数据结构与算法 —— 二叉树
  5. 【原创】Struts2.5.12版本中使用通配符*
  6. telnet命令的使用
  7. TCP/IP学习笔记-如何理解
  8. Linux下设置时区(通过shell设置和程序中设置)及程序中设置环境变量
  9. 在织梦模板中不适用ajax,直接用标签也能调用当前会员的信息
  10. 在测试集上训练,还能中CVPR?这篇IEEE批判论文是否合理?