美文网首页
Android基于Mina实现的Socket长连接(一)

Android基于Mina实现的Socket长连接(一)

作者: 奋斗小青年Jerome | 来源:发表于2017-10-25 10:14 被阅读469次

    Mina是Apache社区维护的一个开源的高性能IO框架,在业界内久经考验,广为使用。Mina与后来兴起的高性能IO新贵Netty一样,都是韩国人Trustin Lee的大作,二者的设计理念是极为相似的。在作为一个强大的开发工具的同时,这两个框架的优雅设计和不俗的表现,有很多地方是值得学习和借鉴的。
    Mina的底层依赖的主要是Java NIO库,上层提供的是基于事件的异步接口

    Mina工作原理

    先来看一下Mina的几个关键概念

    • IoServer
      最底层的是IOService,负责具体的IO相关工作。这一层的典型代表有IOSocketAcceptor和IOSocketChannel,分别对应TCP协议下的服务端和客户端的IOService。IOService的意义在于隐藏底层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连接(在Mina中UDP也被抽象成了连接)。通过IoSession,可以获取当前连接相关的上下文信息,以及向远程peer发送数据。发送数据其实也是个异步的过程。发送的操作首先会逆向穿过IoFilterChain,到达IoService。但IoService上并不会直接调用底层IO接口来将数据发送出去,而是会将该次调用封装成一个WriteRequest,放入session的writeRequestQueue中,最后由IoProcessor线程统一调度flush出去。所以发送操作并不会引起上层调用线程的阻塞。

    总体来讲Mina框架分3层:

    1. I/O Service :负责处理I/O,执行IO操作;
    2. I/O Filter Chain :过滤链。负责编码处理,字节到数据结构或数据结构到字节的转换等,即非业务逻辑的操作
    3. I/O Handler :负责处理业务逻辑

    综上是Mina的简单原理解析,参考Mina官网
    Android基于Mina实现的Socket长连接(二)

    相关文章

      网友评论

          本文标题:Android基于Mina实现的Socket长连接(一)

          本文链接:https://www.haomeiwen.com/subject/yoofpxtx.html