设为首页 收藏本站
查看: 503|回复: 0

[经验分享] Apache MINA框架简述

[复制链接]

尚未签到

发表于 2017-1-3 09:37:36 | 显示全部楼层 |阅读模式
  1。MINA 框架简介
  下图为本人根据对MINA的简要理解,所画出来的框架简图:

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323102-1-1.html 上篇帖子: Apache的Mod_rewrite 例子 下篇帖子: apache rewrite拟静态
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表