MINA学习汇总

Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序。它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。

Apache Mina简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!

Mina在整个网通通信结构中位置:

Mina处于中间层,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输;

------总之:Mina是底层数据传输和用户应用程序交互的接口!

Mina工作流程图如下:

这个流程图不仅很直观的看出了Mina的工作流程,也涵盖了Mina的三个核心接口:IoService接口,IoFilter接口和IoHandler接口:

l  第一步. 创建服务对象(客户端或服务端)  ---IoService接口实现

l  第二步. 数据过滤(编码解码等)          ---IOFilter接口实现

l  第三步. 业务处理                        ---IoHandler接口实现

IoAccepter 相当于网络应用程序中的服务器端

IoConnector 相当于客户端

IoSession 当前客户端到服务器端的一个连接实例

IoHandler 业务处理逻辑

IoFilter 过滤器用于悬接通讯层接口与业务层接口

Mina的精髓是IOFilter,它可以进行日志记录,信息过滤,编码解码等操作,把数据接收发送从业务层独立出来。

创建服务对象,则是把NIO繁琐的部分进行封装,提供简洁的接口。

业务处理是我们最关心的部分,跟普通的应用程序没任何分别。

1.IoService接口

作用:IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。

类结构

常用接口为:IoService,IoAcceptor,IoConnector

常用类为:NioSocketAcceptor,NioSocketConnector

类图如下:

IoService是创建服务端和客户端的接口,实际应用中我们大多都是应用它的实现类来创建服务对象

2.IoFilter接口

Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。这些都是由IoFilter完成的,因此IoFilter是Mina的精髓所在。

在Mina程序中,IoFilter是必不可少的;有了它,Mina的层次结构才异常清晰:

IoFilter   ----   消息过滤

IoHandler  ----   业务处理

Filter,过滤器的意思。IoFilter,I/O操作的过滤器。IoFilter和Servlet中的过滤器一样,主要用于拦截和过滤网络传输中I/O操作的各种消息

类结构

常用接口为:IoFilter,IoFilterChainBuilder

常用类为:IoFilterAdapter,DefaultIoFilterChainBuilder

ProtocolCodecFilter,LoggingFilter

类图如下:

可以在IoService中添加多个IoFilter

eg:

// 创建一个非阻塞的server端的Socket

acceptor = new NioSocketAcceptor();

// 设置日志过滤器

acceptor.getFilterChain().addLast("logger",new LoggingFilter());

// 设置过滤器(使用Mina提供的文本换行符编解码器)

acceptor.getFilterChain().addLast(

"codec",

new ProtocolCodecFilter(new TextLineCodecFactory(Charset

.forName("UTF-8"),

LineDelimiter.WINDOWS.getValue(),

LineDelimiter.WINDOWS.getValue())));

// 获得IoSessionConfig对象

IoSessionConfig cfg = acceptor.getSessionConfig();

// 读写通道10秒内无操作进入空闲状态

cfg.setIdleTime(IdleStatus.BOTH_IDLE, 10);

// 绑定逻辑处理器

acceptor.setHandler(new Demo1ServerHandler());

// 绑定端口

acceptor.bind(new InetSocketAddress(PORT));

logger.info("服务端启动成功...     端口号为:" + PORT);

IoFilter是转码和解码用滴。在实际的应用开发中,自定义协议是必用的,因为很多客户端和服务端是不同语言实现的。

3.IoHandler接口

IoHandler是Mina实现其业务逻辑的顶级接口;它相当简单,你就理解它是根据事件触发的简单应用程序即可。

在IoHandler中定义了7个方法,根据I/O事件来触发对应的方法:

import java.io.IOException;

public interface IoHandler {

void sessionCreated(IoSession session) throws Exception;

void sessionOpened(IoSession session) throws Exception;

void sessionClosed(IoSession session) throws Exception;

void sessionIdle(IoSession session, IdleStatus status) throws Exception;

void exceptionCaught(IoSession session, Throwable cause) throws Exception;

void messageReceived(IoSession session, Object message) throws Exception;

void messageSent(IoSession session, Object message) throws Exception;

}

sessionCreated:当一个新的连接建立时,由I/O processor thread调用;

sessionOpened:当连接打开是调用;

messageReceived:当接收了一个消息时调用;

messageSent:当一个消息被(IoSession#write)发送出去后调用;

sessionIdle:当连接进入空闲状态时调用;

sessionClosed:当连接关闭时调用;

exceptionCaught:当实现IoHandler的类抛出异常时调用;

一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSession的write方法发送出消息!(注意:这里接收到的消息都是Java对象,在IoFilter中所有二进制数据都被解码啦!)

一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以!

Iohandler的7个方法其实是根据session的4个状态值间变化来调用的:

Connected会话被创建并使用;

Idle会话在一段时间(可配置)内没有任何请求到达,进入空闲状态;

Closing会话将被关闭(剩余message将被强制flush);

Closed会话被关闭;

状态转换图如下:

Java NIO是相对于传统的IO操作而言的,因为提出了缓冲池等概念,使它的处理数据的效率大大提高;

多线程是并发处理的明智选择;为减少系统开销,线程池是并发应用中是经常使用的技术;

异步处理机制可以大大缩短每个请求的响应时间;

Mina2中就大量使用了这三项技术,使得它成为优秀的网络应用框架。

(Mina是Java NIO实现的应用框架,更倾向于短连接的服务。

服务端程序或客户端程序创建过程:创建连接——>添加消息过滤器(编码解码等)——>添加业务处理)

MINA学习汇总的更多相关文章

  1. ABP 学习汇总

    本文背景 公司最近规划的新框架准备基于ABP来搭建,自从在阳铭博客看到ABP框架的介绍后,就一直持续关注着,但还没真正在实际项目中直接使用ABP,只是自己做了一些学习和Demo.ABP所用到的一些新技 ...

  2. JS object(对象)的学习汇总

    Object(对象)是在所有的编程语言中都十分重要的一个概念,对于事物我们可以把他们看作是一个对象,而每一个事物都有自己的表示的属性和对于某一信息作出的相应的操作.而这些东西就变成了事物的属性和方法. ...

  3. mina学习(一)

    Mina:是一个帮助用户开发高性能和高伸缩性网络应用程序的框架 学习地址链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ...

  4. HTTP头学习汇总

    在开发http请求的时候,对HTTP头部信息一知半解,各种百度谷歌汇总一下学习到的资料.   http简介 HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于 ...

  5. sencha touch 学习汇总(转)

    1.官方网站:http://www.sencha.com/products/touch/ 2.在线文档:http://docs.sencha.com/touch/2.2.1/ 3.在线翻译文档:htt ...

  6. 【MINA学习笔记】—— 1.体系结构分析[z]

    前言 Apache的MINA框架是一个早年非常流行的NIO框架,它出自于Netty之父Trustin Lee大神之手.虽然目前市场份额已经逐渐被Netty取代了,但是其作为NIO初学者入门学习框架是非 ...

  7. Eucalyptus学习汇总

    Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) 是一种开 ...

  8. Mina学习之---mina整体流程介绍

    现在公司使用的NIO框架一直时候Mina,当然这也的框架还有Netty.虽然一直在用,但只是简单的停留在业务层面,最近面试的时候有问Mina相关的东西.在之前的博客中已经对BIO,NIO,AIO这三种 ...

  9. Java期末课程学习汇总。

    本学期面向对象与Java程序设计课程已经结束了,给自己学习来个总结. 本学期过的非常快,不得不说这一学期学到的东西很少,感觉自己的进步很小. 而且感觉自己总少了点什么,在写这篇总结前,我认真想了,很多 ...

随机推荐

  1. jQuery.each(object, [callback])数组对象操作--jQuery 对象访问 $().each(callback)

    jQuery.each(object, [callback]) 通用例遍方法,可用于例遍对象和数组. 不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象.回调函数拥 ...

  2. 求其中同一个主叫号码的两次通话之间间隔大于10秒的通话记录ID

    求其中同一个主叫号码的两次通话之间间隔大于10秒的通话记录ID 例如:6,7,8,9,10条记录均符合 ID 主叫号码 被叫号码      通话起始时间            通话结束时间       ...

  3. centos7下搭建NFS服务器

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. nfs为什么需要RPC?因为NFS支持的功能很多,不同功能会 ...

  4. 并发编程5 操作系统&进程

    一.今日大纲 1.multiprocessing模块简单应用 2.for循环创建进程 3.进程传参方式和创建方式2 4.join方法 5.操作系统基础 二.今日内容 (1)操作系统简单介绍 多道技术: ...

  5. python中counter()记数

    一:定义一个list数组,求数组中每个元素出现的次数 如果用Java来实现,是一个比较复杂的,需要遍历数组list. 但是Python很简单:看代码 a = [1,4,2,3,2,3,4,2] fro ...

  6. 原!!junit mockito 自定义参数匹配 -- ArgumentMatcher

    前两天写单元测试的时候,发现一个dao对象 mock成功了,但是调用该dao对象的某个方法时,并没有按照设定的值返回,而是返回null. 但是记得之前也都是这么写没有碰到问题,直接mock对象,调用方 ...

  7. caffe杂

    一.finetune命令: mpirun /home/zhangsuosheng/caffe_mpi/build/tools/caffe train -solver solver.prototxt - ...

  8. 我的Android进阶之旅------>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类

    下面是一个Android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确,也不需要验证服务器证书中的域名是否有效. (PS:建议下 ...

  9. sql server安装教程(2008 R2,图形界面安装/命令提示符安装即静默安装)

    转自:http://blog.51cto.com/jimshu/585023 SQL Server 2008(32/64位)下载地址: 链接:https://pan.baidu.com/s/1eR5b ...

  10. STL 中的链表排序

    一直以来学习排序算法, 都没有在链表排序上下太多功夫,因为用得不多.最近看STL源码,才发现,原来即使是链表,也能有时间复杂度为O(nlogn)的算法, 大大出乎我的意料之外,一般就能想到个插入排序. ...