首先,Mina是什么?能帮我们做什么?我研究一个新技术的时候,首先问的就是这样的问题。我个人的理解就是Mina是一个关注于通讯层的框架,任何需要底层通讯的应用,都可以使用它。

AD:2013大数据全球技术峰会课程PPT下载

首先,Mina是什么?能帮我们做什么?我研究一个新技术的时候,首先问的就是这样的问题。我个人的理解就是Mina是一个关注于通讯层的框架,任何需要底层通讯的应用,都可以使用它。更详细准确的介绍,请看官方网站http://mina.apache.org/

Mina的优势:

1. 用NIO实现,无需太多线程。可以处理的并发量更大。

2. 对于应用层来说,编程更方便。

好了废话少说,先看个Demo吧


  1. public static void main(String[] args) throws IOException {
  2. // 创建Acceptor
  3. IoAcceptor acceptor = new NioSocketAcceptor();
  4. // 注册filter
  5. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  6. acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  7. // 注册你的业务处理类
  8. acceptor.setHandler( new TimeServerHandler() );
  9. // 配置参数
  10. acceptor.getSessionConfig().setReadBufferSize( 2048 );
  11. acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
  12. // 让Acceptor在绑定的地址侦听
  13. acceptor.bind( new InetSocketAddress(PORT) );
  14. }
IoHandler

  1. public interface IoHandler {
  2. void sessionCreated(IoSession session) throws Exception;
  3. void sessionOpened(IoSession session) throws Exception;
  4. void sessionClosed(IoSession session) throws Exception;
  5. void sessionIdle(IoSession session, IdleStatus status) throws Exception;
  6. void exceptionCaught(IoSession session, Throwable cause) throws Exception;
  7. void messageReceived(IoSession session, Object message) throws Exception;
  8. void messageSent(IoSession session, Object message) throws Exception;
  9. }

首先new一个Acceptor,可以看出,Acceptor是我们要操作的服务器对象。然后,向Acceptor里注册了两个filter。filter的概念类似于web服务器里的filter。filter处于你的业务端代码和具体的发送数据代码之间,它负责过滤或者说处理传递过来的信息。业务处理代码,写在Handler里。

代码结构相当的清晰。我们需要填写的业务代码就是 Handler 和 Filter了。它们俩很相似,但是在概念上是有区别的。filter事实上主要是处理底层的通信字节流,通信协议等,一般跟业务逻辑没什么关系。Handler是专门暴露给应用开发者,用来填写业务处理代码的。

看看下面的图便知道了

Mina暴露给开发者的接口主要是IoAcceptor(服务器端)或者IoConnector(客户端)。Mina内部具体是怎么实现侦听,处理连接的呢?我们先来介绍一下Mina的方法哲学或者说术语吧。

IoSession

IoSession: IoSession是一个客户连接的抽象,整个通讯框架可以说,都是围绕着IoSession工作的。

IoAcceptor: 初始化服务器,用的就是它

IoProcessor: 负责处理IoSession,包括创建,移除,读写事件的处理

IoFilter: 过滤消息或者说消息处理(通讯层的)

IoHandler: 消息处理(应用逻辑层的)

通讯层的核心类,事实上是IoAcceptor,IoProcessor,IoSession。在这里我们只分析IoAcceptor模式,也就是服务器端的代码。客户端的代码与此类似,大家可以自己研究。

首先,调用IoAcceptor.bind()方法时,服务器已经初始化完毕,这时服务器就在指定的端口上开始侦听客户端发来的连接请求。

当IoAcceptor侦听到客户端请求时,它就会把这个请求交给IoProcessor进行处理。然后IoAcceptor回去继续侦听。显然,IoAcceptor的工作流程就是 侦听 --> 传递请求 --> 继续侦听。

IoProcessor得任务则是处理这些连接的IO事件。显然IoProcessor不可能和IoAcceptor在同一个线程里运行。他们两个分工不同,可以并发执行。Mina内部事实上维护了一个IoProcessor对象池,对象池的默认大小是CPU个数+1.也就是说,如果你的机器是4核的,可能就有5个IoProcessor(可以理解为线程)同时工作。

看看下面的示意图吧,一图胜千言:

在这里主要分析IoAcceptor 和 IoProcessor。

IoAcceptor比较简单,它的核心代码都在AbstractPollingAccetor里,轮询代码在它的内部类Accetpor里的run方法里。请看下面的UML图:

IoProcessor比较复杂,它的主要代码是在AbstractPollingProcessor里的,轮询代码在它的内部类Processor里的run方法实现。值得注意的是,IoAcceptor所持有的IoProcessor引用,事实上是一个对象池。对象池负责调度某个Processor来处理请求。下面是UML类图



解析Mina代码三部曲的更多相关文章

  1. 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView

    本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...

  2. 分析和解析PHP代码的7大工具

    PHP已成为时下最热门的编程语言之一,然而却有许多PHP程序员苦恼找不到合适的工具来帮助自己分析和解析PHP代码.今天小编就为大家介绍几个非常不错的工具,来帮助程序员们提高自己的工作效率,一起来看看吧 ...

  3. 用phpQuery像jquery一样解析html代码

    简介 如何在php中方便地解析html代码,估计是每个phper都会遇到的问题.用phpQuery就可以让php处理html代码像jQuery一样方便. 项目地址:https://code.googl ...

  4. Android JSON 解析关键代码

    Android Json 解析其实还是蛮重要的知识点,为什么这么说呢,因为安卓通信大部分的协议都是使用 json 的方式传输,我知道以前大部分是使用的 xml ,但是时代在发展社会在进步,json 成 ...

  5. CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析

    [CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110)    Microsoft Wi ...

  6. 使用python解析C代码

    我有一个巨大的C文件(~100k行),我需要能够解析.主要是我需要能够从其定义中获取有关每个结构的各个字段的详细信息(如结构中每个字段的字段名称和类型).是否有一个好的(开源,我可以在我的代码中使用) ...

  7. tensorflow+inceptionv3图像分类网络结构的解析与代码实现

    tensorflow+inceptionv3图像分类网络结构的解析与代码实现 论文链接:论文地址 ResNet传送门:Resnet-cifar10 DenseNet传送门:DenseNet SegNe ...

  8. Python 大数据量文本文件高效解析方案代码实现

    大数据量文本文件高效解析方案代码实现 测试环境 Python 3.6.2 Win 10 内存 8G,CPU I5 1.6 GHz 背景描述 这个作品来源于一个日志解析工具的开发,这个开发过程中遇到的一 ...

  9. PE头结构解析(代码实现)

    PE头结构解析(代码实现) 图表实现在:https://www.cnblogs.com/juicyhumberger/articles/17064764.html #include "std ...

  10. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

随机推荐

  1. 物体检测序列之一:NMS

    IoU (Intersection over Union),交并比,是衡量物体检测模型在特定数据集上检测效果好坏的一个常用的标准,通常情况下,想要通过IoU来衡量物体检测模型好坏需要具备以下几点: 1 ...

  2. 小tips:postMessage处理iframe跨域通信

    实例 父页面发消息给子页面,子页面接收消息后回复父页面. 父页面代码: <body> 父级页面: <button id="btn">给iframe子页面传递 ...

  3. C++ 指针动态内存分配

    动态内存分配 动态内存分配:即由程序员手动的进行内存空间的分配.内存空间的释放的内存管理操作 C++代码中,变量.数组等对象的创建,是由C++自动分配内存的,称之为(自动)静态内存分配 (自动)静态内 ...

  4. QT硬件异构计算

    QT硬件异构计算 使用AI技术辅助生成 1 QT硬件异构计算概述 1.1 硬件异构计算概念 1.1.1 硬件异构计算概念 硬件异构计算概念 <QT硬件异构计算>正文 硬件异构计算概念 在进 ...

  5. 加入 Flutter Engage,Pick 您的专属 Dash 形象!

    Flutter Engage 活动精彩来袭 对 Flutter 团队的开发者们来说,交流的重要性不言而喻,和您一样,我们也希望开发者们能够在不同的情境下进行互动分享.于是我们为您准备了一场特别的线上活 ...

  6. Kubernetes Pod原理(十六)

    一.Pod Kubernetes 最基本的调度单元 前面我们了解了 Kubernetes 的基本架构,以及如何使用资源清单在集群中部署一个应用.我们也了解到了 Pod 是 Kubernetes 集群中 ...

  7. SuperMap iDesktopX创建HBase数据源并导入数据

    需提前部署HBase集群,HBase环境搭建请查看文章https://www.cnblogs.com/zhangyongli2011/p/12034628.html 本文基于10.1.1 win版本s ...

  8. Microsoft 发布 .NET 9 RC 2

    距离最终版本还有一个月的时间,Microsoft 已经交付了 .NET 9 的第二个也是最后一个候选版本..NET 团队在公告帖子中写道[1],"当我们为 11 月的 .NET 9 正式发布 ...

  9. Need BLUETOOTH PRIVILEGED permission以及requestMtu导致蓝牙断连问题

    在部分Android手机上,当连接上GATTService后直接requestMtu有可能会造成蓝牙连接中断,随后继续重新连接会报错Need BLUETOOTH PRIVILEGED permissi ...

  10. 小A的组合数

    小A的组合数 题目描述 \(C_n^m\)表示组合,组合公式为:\(C_n^m=\frac{n!}{m!\times (n-m)!}\),请你求出\(C_n^m\)的因子个数\(tot\),由于大难会 ...