MINA核心结构和处理消息的逻辑流程

1.MINA 核心结构

IoService

  最底层的是IOService,负责具体的IO相关工作。这一层的典型代表有IOSocketAcceptorIOSocketChannel,分别对应TCP协议下的服务端和客户端的IOServiceIOService的意义在于隐藏底层IO的细节,对上提供统一的基于事件的异步IO接口。每当有数据到达时,IOService会先调用底层IO接口读取数据,封装成IoBuffer,之后以事件的形式通知上层代码,从而将Java NIO的同步IO接口转化成了异步IO。所以从图上看,进来的low-level IO经过IOService层后变成IO Event

  具体的代码可以参考org.apache.mina.core.polling.AbstractPollingIoProcessor的私有内部类Processor

IoFilterChain

  Mina的设计理念之一就是业务代码和数据包处理代码分离,业务代码只专注于业务逻辑,其他的逻辑如:数据包的解析,封装,过滤等则交由IoFilterChain来处理。IoFilterChain可以看成是Mina处理流程的扩展点。这样的划分使得结构更加清晰,代码分工更明确。开发者通过往Chain中添加IoFilter,来增强处理流程,而不会影响后面的业务逻辑代码。

IoHandler

 IoHandler是实现业务逻辑的地方,需要有开发者自己来实现这个接口。IoHandler可以看成是Mina处理流程的终点,每个IoService都需要指定一个IoHandler

IoSession

 IoSession是对底层连接的封装,一个IoSession对应于一个底层的IO连接(在MinaUDP也被抽象成了连接)。通过IoSession,可以获取当前连接相关的上下文信息,以及向远程peer发送数据。发送数据其实也是个异步的过程。发送的操作首先会逆向穿过IoFilterChain,到达IoService。但IoService上并不会直接调用底层IO接口来将数据发送出去,而是会将该次调用封装成一个WriteRequest,放入sessionwriteRequestQueue中,最后由IoProcessor线程统一调度flush出去。所以发送操作并不会引起上层调用线程的阻塞。

 

 

2.MINA处理消息的逻辑流程

第1种:

  • IOAcceptor 监听网络数据包传入的连接;
  • 为每个新的连接(Connection)创建一个session,同一个端口+ip的后续请求将通过session进行处理;
  • 同一个session收到的所有数据,通过过滤链进行过滤.通过PacketEncoder/Decoder进行有效的编码,解码处理(负责把底层传输的对象拼装为更高一层的对象方便后续的处理,最后传输的数据被交给IOHandler)
  • 最后根据自己的业务需求完成Handler的业务逻辑处理.

第2种:

 通过SocketAcceptor 同客户端建立连接; 

     连接建立之后 I/O的读写交给了I/O Processor线程,I/O Processor是多线程的; 

     通过I/O Processor 读取的数据经过IoFilterChain里所有配置的IoFilter IoFilter  进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议; 

     最后  IoFilter 将数据交给 Handler  进行业务处理,完成了整个读取的过程; 

     写入过程也是类似,只是刚好倒过来,通过IoSession.write 写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过 I/O Processor 将数据写出到 socket 通道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值