为什么80%的码农都做不了架构师?>>>   

1、MINA 框架简介

下图为本人根据对MINA的简要理解,所画出来的框架简图:

Apache MINA 是一个网络应用框架,有助于用户非常方便地开发高性能、高伸缩性的网络应用。它通过Java NIO提供了一个抽象的、事件驱动的、异步的位于各种传输协议(如TCP/IP和UDP/IP)之上的API,Apache MINA 通常可被称之为:

l         NIO 框架库;
l         客户端/服务器框架库;
l         或者一个网络socket库。

MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。

当客户首次访问采用MINA编写的程序时,IoAcceptor作为线程运行,负责接受来自客户的请求。当有客户请求连接时,创建一个Session,该Session与IoProcessor、SocketChannel以及IOService联系起来。IoProcessor也作为另外一个线程运行,定时检查(轮询)客户是否有数据到来,并对客户请求进行处理,依次调用在IOService注册的各个IoFilter,最后调用IoHandler进行最终的逻辑处理,再将处理后的结果Filter后返回给客户端。

MINA框架的常用类

1.类NioSocketAcceptor

用于创建服务端监听

2.类NioSocketConnector

用于创建客户端连接;

3.类IoSession

2、IoSession

Session可以理解为服务器与客户端的特定连接,该连接由服务器地址、端口以及客户端地址、端口来决定。客户端发起请求时,指定服务器地址和端口,客户端也会指定或者根据网络路由信息自动指定一个地址、自动分配一个端口。这个地址、端口对构成一个Session。

Session是服务器端对这种连接的抽象,MINA对其进行了封装,定义了IoSession接口,用来代表客户端与服务器的连接,在服务器端来指代客户端,实现对客户端的操作、绑定与客户端有关的信息与对象。通过利用Session的这个概念,编写程序时就可以在服务器端非常方便地区分出是当前处理的是哪个客户端的请求、维持客户端的状态信息、可以实现客户端之间相互通讯。

IoSession提供以下一些常用方法:

(1)setAttribute(Object key, Object value)     getAttribute(Object key)

设置/获取用户定义的属性。

将该属性与session联系起来,方便以后处理用户请求时使用。比如如果要求用户登录后才能继续进行操作,那么在用户成功登陆后,可以通过setAttribute()设置一个属性,当用户以后继续请求时,可以通过getAttribute()获取该属性来判断用户是否登录。

(2)getRemoteAddress()

获取远程客户端地址。

(3)getId() getCreationTime()   getLastIoTime() getConfig()

获取Session的Id、创建时间、上次IO时间、配置信息。

(4)write(Object message)

将数据发送给客户端。

(5)close()

关闭Session。

说明:可以在Session中发送数据,但是Session没有提供读取数据的方法,读取数据通过另一套机制在IoHandler(封装读取用户数据)的messageReceived()中实现。

3、Event

MINA可以看成是事件驱动的。通常在网络通讯中,可以将整个过程划分为几个基本的阶段,如建立连接、数据通信、关闭连接。

数据通信一般包括数据的发送和接收,由于在通信过程中,可能要多次发送和接收数据,以进行不同的业务交互。

不可能一直都接收和发送数据,因此就有Idle出现,在MINA中,

如果在设定的时间内没有数据发送或接收,那么就会触发一个Idle事件。(心跳机制?????)

由于某种原因,可能会发生错误,导致系统异常发生,引发exception。

因此,如果从事件发生的角度看的话,就可以在MINA中将通信看成由一个建立链接(sessionCreated 和 sessionOpened )、多个数据接收和发送、一个关闭连接事件以及多个Idle事件等7种事件组成的过程。

Session是对双方相互通信的抽象,因此通信的过程就是一系列与Session相关的事件。

在MINA现在对TCP的实现中,sessionCreated 和 sessionOpened 没有区别。因此严格来说,有6种类型的事件。

4、IoHandler

从以上MINA框架简图可以看出,对来自客户端数据最终处理是在IoHandler中处理的。IoHandler封装了来自客户端不同事件的处理,如果对某个事件感兴趣,可以实现相应的方法,当该事件发生时,IoHandler中的方法就会被触发执行。IoHandler总共有7个方法对应7个事件:

(1)void exceptionCaught(IoSession session, Throwable cause)

有异常发生时被触发。

(2)void messageReceived(IoSession session, Object message)

有消息到达时被触发,message代表接收到的消息。

(3)void messageSent(IoSession session, Object message)

发送消息时时被触发,即在调用IoSession.write()时被触发,message代表将要发送的消息。

(4)void sessionClosed(IoSession session)

当连接关闭时被触发,即Session终止时被触发。

(5)void sessionCreated(IoSession session)

当创建一个新连接时被触发,即当开始一个新的Session时被触发。

(6)void sessionIdle(IoSession session, IdleStatus status)

当连接空闲时被触发。使用IoSessionConfig中的setIdleTime(IdleStatus status, int idleTime)方法可以设置session的空闲时间。如果该Session的空闲时间超过设置的值,该方法被触发,可以通过session.getIdleCount(status)来获取sessionIdle被触发的次数。(类似心跳)

(7)void sessionOpened(IoSession session)

当打开一个连接时被触发。在目前的实现中,好像 sessionOpened 和 sessionCreated 没有太大区别,sessionCreated 在 sessionOpened 之前被触发。(是否客户端空闲太久就把该链接放入链接轮询的池里面,openged只是重新打开链接?????)

IoHandler是一个接口,一般情况没有必要直接实现该接口的每一个方法。MINA提供了一个IoHandlerAdapter类,该类实现了IoHandler要求的方法,但是都没有做任何处理。当我们要编写自己的Handler时,可以扩展IoHandlerAdapter,重写我们关心的事件方法即可。比如,一般情况,我们比较关心是否接收到数据这个事件,那么我们就可以覆盖messageReceived方法,不用管其他方法。

5、IoFilter(过滤器)

IoFilter用来对客户的请求或发送给客户的数据进行filter。与IoHandler一样,Filter也是基于事件的,通过实现IoFilter接口,就可以对通信过程中的Session的事件进行处理。

Filter是一种链式结构,与IoHandler不同,处理每一种Session事件的函数中,除了传入session对象外,还传入了NextFilter对象,用来代表下一个Filter。一般情况,在处理结束后,调用下一个filter的相应方法作进一步处理。Filter也可以针对特定的通信或数据,不进行进一步处理,就可以不用调用NextFilter的相应方法。

除了与Session相应的7种事件外,在IoFilter中还可以对Filter的init、destroy以及add、remove等作出处理。

MINA提供了一个IoFilterAdapter类,我们要编写自己的Filter时,可以扩展IoFilterAdapter,不用直接实现IoFilter接口。

Apache MINA提供一个LoggingFilter类,用来log通信过程。

MINA 的基础架构

下图是 MINA 的架构图,

在图中的模块链中,IoService 便是应用程序的入口,相当于我们前面代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。在上面的例子中,我们是这样使用 IoAccepter 的:

IoAcceptor acceptor = new SocketAcceptor();

相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。

注意:

如果你使用mina建立一个socket添加了如下:
IoFilter CODEC_FILTER = new ProtocolCodecFilter(new TextLineCodecFactory());
connector(acceptor).getFilterChain().addLast("codec", CODEC_FILTER);
如果发送数据的socket不是同样的设置或者不是利用mina建立的socket则发送数据的时候需要在数据末尾添加‘\n’,以表示字符串结.

代码事例
功能描述:编写一个服务器监听客户机的程序,当客户机访问服务器的时候,服务器输出客户机的访问信息(http),然后将访问信息和第几位客户告诉客户机。
处理器代码:
SamplMinaServerHandler.java

package com.javake.mina.sampleserver;import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;public class SamplMinaServerHandler extends IoHandlerAdapter {// 当一个客端端连接进入时@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("incomming client : " + session.getRemoteAddress());}// 当一个客户端关闭时@Overridepublic void sessionClosed(IoSession session) {System.out.println("one Clinet Disconnect !");}// 当客户端发送的消息到达时:@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {// 我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:String s = (String) message;// Write the received data back to remote peerSystem.out.println("收到客户机发来的消息: " + s);// 测试将消息回送给客户端session.write(s + count);count++;}private int count = 0;
}

启动服务器的主类:
MainServer.java

package com.javake.mina.sampleserver;import java.net.InetSocketAddress;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MainServer {public static void main(String[] args) throws Exception {// 创建一个非阻塞的Server端Socket,用NIOSocketAcceptor acceptor = new NioSocketAcceptor();// 创建接收数据的过滤器DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();// 设定这个过滤器将一行一行(/r/n)的读取数据chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));// 设定服务器端的消息处理器:一个SamplMinaServerHandler对象,acceptor.setHandler(new SamplMinaServerHandler());// 服务器端绑定的端口int bindPort = 9988;// 绑定端口,启动服务器acceptor.bind(new InetSocketAddress(bindPort));}
}

转载于:https://my.oschina.net/leoson/blog/103295

Apache Mina 介绍相关推荐

  1. Apache Mina开发手册

    作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.介绍 Apache Mina是一个网络应用框架,简化用户开发高性能.高可扩展性的网络应用程序的难度.M ...

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

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

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

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

  4. Apache MiNa 2 学习笔记

    http://blog.csdn.net/cgwcgw_/article/details/18402769 http://download.csdn.net/detail/xiaozhu_1986/2 ...

  5. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

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

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

  7. Apache Mina

    Apache Mina(一) Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架.它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的.事件驱动的.异步 ...

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

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

  9. apache mina 2

    1 介绍 Apache MINA 是一个网络应用程序框架,它对Java中的socket和NIO进行了有效和清晰的封装,方便开发人员开发TCP/UDP程序,从而抛开在使用原始的socket时需要考虑的各 ...

最新文章

  1. WSL 或者ubantu安装 apt-get install npm 失败解决方法
  2. Sequelize小记
  3. Mathematica图片修复
  4. opencv-python人脸识别初探
  5. java视图扩展_java – 可扩展列表视图 – 子项,不同的布局
  6. ubuntu设置分辨率
  7. 【mysql】查询过滤器ON,WHERE,HAVING
  8. 记录每天背的单词,准备考研。(2月13日)
  9. 【PA2011】Kangaroos
  10. 导入 xlsx php,php如何使用phpexcel类导入excel表格数据
  11. 浪尖聊聊大数据从业者的迷茫及解决方案
  12. python 鼠标 自动点击_鼠标隔段时间自动点击屏幕
  13. wireshark 找不到wifi网卡
  14. 关于微服务的三个厄运问题
  15. 关于如何开启本地代理隐藏本地ip
  16. JAVA大华摄像头抓拍与API接口集成
  17. 计算机网络(一)——网络编程
  18. PTS,SLM,Filter三种降低PAPR方法的matlab仿真
  19. break在c语言中的应用,c语言中break的用法
  20. Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)

热门文章

  1. 极大似然估计_极大似然估计、极大后验估计和贝叶斯估计
  2. LogiCORE IP Clocking Wizard 之 Core Architecture(时钟IP核的核架构介绍)
  3. awk 抓取文件子集
  4. PyCharm安装mysqlclient一直提示MS Visual C++ 14 required
  5. 《C++ primer》--第三章
  6. Win7 SP1 msado15 unresolved external symbol
  7. 源代码解读Cas实现单点登出(single sign out)功能实现原理
  8. 分享:python,限制任意函数,线程的执行时间或根据条件终止.
  9. java 实现接口后重写方法报错
  10. 杨兴平离职完全是意料之中