当前位置:文档之家› mina 框架学习

mina 框架学习

mina 框架学习转帖:/s/blog_5f9beca40101ee6w.html1、简介Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。

Apache Mina也称为:l NIO框架l客户端/服务端框架(典型的C/S架构)l 网络套接字(networking socket)类库2、通信流程那么让我们来看一下mina在我们应用中处于什么样的一个位置呢上图可以看出mina位于应用程序和底层网络传输之间,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输。

再来看一下mina 通信流程图可以很清晰看出mina主要有三个主要的业务接口:IoService,IoFilter和IoHandler(1) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。

(2) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。

(3) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。

总的来说创建一个基于mina框架的应用分为三个模块: 创建连接(IoService))——>添加消息过滤器(IoFilter)——>添加业务处理(IoHandler)3、server 和clientmina中server和client没有多大区别都是通过Ioservice建立连接和通信的,来看下具体流程Server 一般地,服务端会有一个端口来监听client的请求/packet,并且为每隔connect建立一个session(无论是基于TCP/IP协议还是UDP协议),Server端主要通过IoAccptor建立连接IOAcceptor继承自IoService主要用于监听网络进来的connecter和packet,对于一个新的连接首先会创建一个session,连接创建之后请求消息会从你的地址和监听的端口中进来并封装所以的packet接收完成之后如上图所示,过滤器链会对其进行过滤,过滤完成之后会交给IoHandler进行业务处理,这就是一个请求到达server后mina的处理流程。

client 一般地,client端主要功能为何server建立连接发送消息和处理server传回的消息,client主要通过IoConnector建立连接,流程如下1、client端首先通过IoConector与server建立连接,初始化并绑定改到server,连接建立后会和一个session绑定2、建立连接之后,如果要发送数据到server那么所发送的数据也会经过filter进行过滤器链之后再发送到server3、当有数据从server返回的时候,再数据全部接收完成之后,数据再经过IoFilter过滤器链最后交给IoHandler处理IoService是一mina中非常重要的一个接口,他贯穿了整个mina 通信流程,建立远程连接、发送消息、连接等IoService接口提供了一些连接常用接口,在server端IoAcceptor继承了IoService,在client 端IoConnector继承了IoService完成客户端功能,IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。

下面将从几个方面介绍IoServiceIoService简介IoSerivce接口功能IoAcceptorIoConnector1、IoService简介IoService提供了一个I/O服务和管理I/Osession的一个功能,是mina框架最重要的一个部分,为实现了IoService的类或接口提供了一个很强大的功能用于业务操作接下来用一张思维图来说明IoService和AbstractIoService定义了哪些功能,以及在实际应用中有哪些可以扩展和实现的地方(画图工具XMind.)可以答题总结IoService有几点功能1、session 管理:创建、删除session、监测session 是否失效2、过滤器链管理:管理过滤器连,并且用户可以很方便的自定义创建过滤器3、调用业务handler:在消息接收完成之后,调用业务handler进行处理4、统计管理:统计消息发送量(发送对象、字节....)5、监听网络连接:一直监听绑定端口是否有新的链接6、数据传输:管理server端和client 数据传输IoService是IoConnector's和IoAcceptor's的父接口,他所定义的方法都是和I/O操作息息相关的,下面看下IoService定义了哪些方法,这些方法有些什么功能2、IoService定义方法TransportMetadata g etTransportMetadata()这个方法获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr等。

void a ddListener(IoServiceListener listener)这个方法可以为IoService增加一个监听器,用于监听IoService的创建、活动、失效、空闲、销毁,具体可以参考IoServiceListener接口中的方法,这为你参与IoService的生命周期提供了机会。

void r emoveListener(IoServiceListener listener)这个方法用于移除addListener的方法添加的监听器。

boolean i sDisposing()返回isDisposed() 的状态,当且仅当isDisposed() 方法被调用完毕才返回TRUEboolean i sDisposed()返回service的状态,当且仅当service 的当前进程的所有资源已经释放完毕才返回TRUE void d ispose()这个方法用于释放service分配的资源,他可能要花费一些时间,用户应该调用isDisposing()和isDisposed()判断资源是否释放完成,当一个service被关闭的时候都应该调用该方法来进行资源释放IoHandler g etHandler()返回当前进程serbice关联的handlervoid s etHandler(IoHandler handler)这个方法用于向IoService注册IoHandler,同时有getHandler()方法获取HandlerMap g etManagedSessions()这个方法获取IoService上管理的所有IoSession,Map 的key 是IoSession的id。

int g etManagedSessionCount()返回当前service 上绑定的session数量IoSessionConfig g etSessionConfig()这个方法用于获取IoSession的配置对象,通过IoSessionConfig对象可以设置Socket 连接的一些选项。

void s etFilterChainBuilder(IoFilterChainBuilder builder)定义service的拦截器链DefaultIoFilterChainBuilder g etFilterChain()返回当前service默认的那个filterchain,是getFilterChainBuilder()快捷方式boolean i sActive()当前service是否在活动long g etActivationTime()返回这个service 被激活现在的时间,也就是service存活了多久. 如果这个service 不是活动状态咋返回它最好一次活动的时间Set b roadcast(Object message)向所有注册了的session 广播消息vo id setSessionDataStructureFactory(IoSessionDataStructureFa ctorysessionDataStructureFactory)向新注册的service 放一些初始化的数据int g etScheduledWriteMessages()返回信息数量(这里的信息时在内存等待socket向外写的)IoServiceStatistics g etStatistics()返回service的IoServiceStatistics对象.3、IoService的实现IoService在mina中时一个很重要的接口,同时呢它又被两个接口所继承,分别是IoAcceptor 和IoConnector,分别代表了服务端和客户端的连接,所有我们在建立server和client的时候必须要实现两个接口或者是继承他们的实现类或适配器类IoAcceptor主要负责在server和client之间建立一个新的连接或者是接收client发送的请求,据说在mina3.0 中会将这个接口命名为Server。

有时候我们可能不是基于某一种协议开发我们的应用,可能会用到多种协议开发(TCP/UDP...),那么这时候mina就为我们提供了很多其他的一些实现,用于不用的需求IoAcceptor有如下几个实现类NioSocketAcceptor : 非阻塞的server端的SocketNioDatagramAcceptor: 非阻塞的server端的Socket (基于UDP协议) AprScoketAcceptor : 基于APR阻塞式的socketVmPipeScoketAcceptor :基于管道的Socket下面来具体看下他们的类关系图IoConnectorIoConnector是用于client端的一些方法定义,在写client端的时候必须实现改接口或者其实现类同样mina也为我们提供了默认实现类(想见mina api文档):NioScoketConnector : 非阻塞的client端的SocketNioDatagramConnector: 基于UDP协议非阻塞的client端的Socket AprScoketConnector :基于Apr的scoketProxyConnector :提供代理的scoketSerialScoket : 提供多个端口连接的scoketVmPipeConnector:基于管道的socket类关系图4、IoAcceptor创建服务端首先在server端的时候要尽早的确立自己用哪种方式进行创建,基于那种协议进行开发,这样可以开始建立server了(1) 建立server[java]1.public TcpServer() throws IOException {2.// 创建一个TCP acceptor3.IoAcceptor acceptor = new NioSocketAcceptor();4.// 为这个accerptor绑定一个用于业务处理的Hanlder实例[java]1.acceptor.setHandler(this);2.// 绑定一个端口用于监听client 请求[java]1.acceptor.bind(new InetSocketAddress(PORT));如果使用的是UDP协议你可以这样[java]1.IoAcceptor acceptor = new NioDatagramAcceptor();(2)关闭连接通过调用dispose() 方法来释放资源( 只为所有挂起的session处理完毕之后就释放资源)[java]1.acceptor.dispose(); // 已经标注为过期的通过调用dispose(true)方法释放资源(等待每隔个线程上的session都完整的执行完毕之后才进行资源释放)[java]1.acceptor.dispose( true ) // 推荐使用这种方法(3) IoService状态可通过isActive()、isDisposed()、isDisposing() 来获取IoService的状态(4)绑定业务操作的hanlder在接收完client传送过来的数据之后,可以用sethandler() 这个方法绑定了的业务类进行操作(5)过滤器可以获取一些mina提供的默认的过滤器,并在过滤器链的末尾开端等加上一些自定义的过滤器[java]1.DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();[java]1.chain.addLast("logger", new LoggingFilter());以上方式为在进入service之后才加的过滤器的,有时候我们想在进入IoService之前就加上Filter,那么可以这样[java]1.// Add a logger filter2.DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();3.chain.addLast("logger", new LoggingFilter());[java]1.// 为service创建一个过滤器2.acceptor.setFilterChainBuilder(chain);session就像mina框架的心脏,没一个client的连接到达server之后都会创建一个新的session,一直保存在内存单元中直到client 连接断开。

相关主题