MINA研究-源代码

mina源代码学习提供下载 mina源代码学习mina源代码学习mina源代码学习mina源代码学习 立即下载

第一部分:mina各层的关系

图1.1

说明

  1. IOService:
    1. 这个接口抽象了一切I/O操作,包括建立端口监听、I/O读写,
  2. IOProcessor:
    1. 为IOService处理正真的I/O读写操作。IOService在某端口监听,当发生int selected = select();时,说明有建立连接的客户端请求,IOService会调用IOProcessor,将session和交给processor处理。
    2. IOProcessor也会有一个int selected = select(1000);的阻塞,等待IO事件。
    3. 当I/O事件到达后,会把输入读入到一个BUF中session.getChannel().read(buf.buf())(Java NIO)。
  3. IOFilter:
    1. 上面IOProcessor得到buf后,会交给 IOFilter处理,如果是读取IO则触发messageReceived方法。
    2. IOFilter一般被包含在一个IoFilterChain中,顾名思义,当然是实现了责任链模式的一根链条咯。
  4. IoHandler:
    1. 是拿到buf做处理的一个接口,是用户最终会面对的一个接口。
    2. 上面的IOFilter得到buf(以接收数据为例),IOFilter调用了IoHandler的messageReceived(s, message);方法。

最后还要提一个接口:

IoSession:

A handle which represents connection between two end-points regardless of

transport types.

实际上这个接口是一个会话服务,或者它更像是一个大容器。后面我们还会讲到它。

 

第二部分:类图

2.1 IOService

  1. IoAcceptor接口:

服务器端接口,接受客户端访问的请求

  1. AbstractIoService

    设定处理函数、Filter、IoServiceListener。

    1. 处理函数是一个Executor或者是Executor的包装。
    2. IoServiceListener可以用于打印日志,主要有Service启动、停止、空闲等监听方法
  2. AbstractIoAcceptor完成绑定监听端口
  3. AbstractPollingIoAcceptor执行具体的监听连接以及监听I/O事件
  4. NioSocketAcceptor用JAVA NIO的方式实现了具体的连接方法ServerSocketChannel,例如open,accept等

 

2.2IoProcessor

显然,这个结构实现了组成模式

SimpleIoProcessorPool内有一个数组,包装了IoProcessor。这个SimpleIoProcessorPool的DEFAULT_SIZE属性,定义了开多少个IoProcessor。

前面讲过IoProcessor为IOService处理正真的I/O读写操作。(在nio下,一个IoProcessor可以在单线程中处理多个连接请求和io事件)除此之外,再开多个IoProcessor,一个IoProcessor启动一个线程。

 

2.3 IoSession

第三部分 源码解读

3.1初始化

SocketAcceptor acceptor = new NioSocketAcceptor();

在图1.1中,我们看到,mina会首先把请求交给IOService。实际上,这个接口也是用户首先面对的接口。

  1. 用户在这个端口上执行setHandler(IoHandler handler)方法。
  2. 并执行IoAcceptor接口的bind(SocketAddress localAddress)方法。
  3. 实例化SocketAcceptor,会super()其父类的构造函数。

我们依次看看三个父类的构造函数

  1. AbstractPollingIoAcceptor

protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,

Classextends IoProcessor> processorClass) {

this(sessionConfig, null, new SimpleIoProcessorPool(processorClass),

true);

}

  • 构造函数AbstractPollingIoAcceptor(new DefaultSocketSessionConfig(), NioProcessor.class);定义了默认的SessionConfig和NioProcessor。
  • new SimpleIoProcessorPool(processorClass)是把NioProcessor包装成了pool.看类图IoProcessor就很好理解了,这是一个组成模式。

 

  1. AbstractIoAcceptor

protected AbstractIoAcceptor(IoSessionConfig sessionConfig, Executor executor) {

super(sessionConfig, executor);

defaultLocalAddresses.add(null);

}

AbstractIoAcceptor主要用来绑定监听端口。这个构造函数没有干其他的事情。

 

  1. AbstractIoService

protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor)

  • 这个构造函数初始化sessionConfig,和当executor为空时,

if (executor == null) {

System.out.println("[GL:executor:]"+executor);

this.executor = Executors.newCachedThreadPool();

createdExecutor = true;

} else {

this.executor = executor;

createdExecutor = false;

}

  • 这个构造函数还有一个监听器,或者叫监听池(可以包含多个监听器)。用来监听service创建、连接、断开等动作,当上述动作发生地时候,会调用listener。里面可以写自己的一些方法。

 

 

3.2 初始化2

acceptor.setHandler(new EchoProtocolHandler());

设定处理函数,EchoProtocolHandler()是用户自己编写的一个handle,看图1.1可以知道,这是mina平台处理的最后一步。Mina把请求经过ioprocessor处理器、多个iofilter过滤器 处理后,才会交给EchoProtocolHandler。

我们看看从IOService到IoHandler之间发生了什么

 

3.3运行

在main()函数中,我们看到一个方法

acceptor.bind(new InetSocketAddress(PORT));

这一个bind方法,表面看只是一个端口绑定,实际上发生了很多有趣的事情。

IOService 类图告诉我们,bind端口应该是AbstractIoAcceptor干的事情,去这个类中找。

 

  1. AbstractIoAcceptor类bind方法

//端口打包成一个list,以实现多端口监听

List localAddresses = new ArrayList(1);

localAddresses.add(localAddress);

 

然后调用了子类 AbstractPollingIoAcceptor 的bind0方法

bind0(localAddressesCopy);

 

  1. AbstractPollingIoAcceptor. bind0方法,把代码贴出来

protected final Set bind0(

Listextends SocketAddress> localAddresses) throws Exception {

      

    //这个request包装了localAddresses,间接包装了localAddress

AcceptorOperationFuture request = new AcceptorOperationFuture(

localAddresses);

 

// adds the Registration request to the queue for the Workers

// to handle

registerQueue.add(request);

 

// creates the Acceptor instance and has the local

// executor kick it off.

/*

        这个方法很重要,我们去看看发生了什么

*/

startupAcceptor();

 

// wakeup()即selector.wakeup();

wakeup();

//bind0结束

 

  1. startupAcceptor();方法内部代码。需要注意的是Acceptor不是IOACCEPTOR,这个Acceptor是一个线程,用于处理IO事件。

if (acceptor == null) {

    /*

                Acceptor完成 即监听连接事件,

                如果有感兴趣的连接发生,即调用 processHandles(selectedHandles());

     */

acceptor = new Acceptor();

//调用爷爷类 AbstractIoService 的方法。

//把acceptor分配给线程池

executeWorker(acceptor);

}

 

  1. Acceptor()代码

private class Acceptor implements Runnable {

public void run() {

int nHandles = 0;

 

while (selectable) {//这个循环用来监听连接到达,以建立连接和io事件

try {

    System.out.println("[GaoLing:]连接建立");

int selected = select();//如果一直没有新连接,则一直会阻塞

 

/*

*这个方法完成:打开ServerSocketChannel通道,注册感兴趣的监听

                    将ServerSocketChannel 丢到boundHandles中去

                    就是在定义的若干个端口放置监听事件,接受accept

                    注意:只是建立监听而已!还没有建立客户端连接!!

完成sessionConfig、IoProcessor的初始化【SocketAcceptor父类】->

acceptor.setHandler【main】

 

  1. 3.4.2运行(对照类图看)

acceptor.bind(new InetSocketAddress(PORT)); 【main】->

AbstractIoAcceptor.bind【AbstractIoAcceptor】->

AbstractPollingIoAcceptor. bind0【AbstractPollingIoAcceptor】->

startupAcceptor()【开线程,监听连接事件,AbstractPollingIoAcceptor】->

class Acceptor【AbstractPollingIoAcceptor】->

processHandles(Iterator handles) 【AbstractPollingIoAcceptor】->

T session = accept(processor, handle); 【初始化session,AbstractPollingIoAcceptor】->

session.getProcessor().add(session); 【处理io事件,AbstractPollingIoAcceptor】->

SimpleIoProcessorPool.add【这里用到了自定义线程池(数组),SimpleIoProcessorPool】->

AbstractPollingIoProcessor.add【调用startupWorker(),AbstractPollingIoProcessor】->

startupWorker();【处理io事件。AbstractPollingIoProcessor】->

processor = new Processor();【线程池,处理IO输入输出数据,AbstractPollingIoProcessor】->

process()【AbstractPollingIoProcessor】->

read(T session) 【AbstractPollingIoProcessor】->

filterChain->

handle

16、保障Azure应用安全:密钥管理与身份认证 本文深入探讨了保障Azure应用安全的关键措施,包括使用网络安全工具(如Application Gateway和Azure Front Door)防范攻击,解决传统密钥和机密存储方式的安全隐患,以及通过Azure Key Vault实现敏感信息的安全管理。同时,介绍了使用托管标识实现Azure资源间安全访问的方法,并结合实际操作步骤展示了如何配置Key Vault、设置访问策略、存储机密以及授予Web应用对SQL Server的访问权限。最后,对不同安全措施进行了比较,并提出了在开发、测试及生产环境中的综合 阅读详情

相关推荐

IC617多线程仿真卡死?手把手教你用TigerVNC替换解决ADE XL Explorer问题(附Manjaro/Centos8实测)

本文针对IC617在Manjaro、CentOS 8等高版本Linux系统中运行ADE XL Explorer进行多线程仿真时出现的卡死问题,提供了详细的诊断与解决方案。文章指出问题根源在于软件内置的旧版VNC组件不兼容,并手把手指导用户通过使用TigerVNC替换原组件来彻底解决,附有在Manjaro和CentOS 8系统上的实测步骤与验证方法。

hill8的博客 774

apache mina:SimpleIoProcessorPool

SimpleIoProcessorPool 主要处理IO输入输出线程池的管理。主要功能为创建线程池,把IoSession与IoProcessor线程相关联,管理IoProcessor线程。

sunning9001的专栏 1510

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南

本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。

weixin_28340315的博客 438

Mina2.0框架源码剖析(三)

 AbstractIoAcceptor类继承自AbstractIoService基类,并实现了IoAcceptor接口,它主要的成员变量是本地绑定地址。Java代码 private final List defaultLocalAddresses =      new ArrayList();  private final

走向资深架构师的旅程 1339

DSSP 工具:蛋白质二级结构信息计算与批量处理教程

DSSP(Dictionary of Secondary Structure in Proteins)是一款经典的蛋白质二级结构计算工具,由荷兰癌症研究所(NKI Research)Perrakis 团队维护。它通过分析蛋白质的 PDB 结构文件,能够自动标注每个氨基酸残基的二级结构类型、相对溶剂可及性(暴露面积)等关键信息,为后续的拓扑图绘制、疏水 / 亲水表面分析、二级结构预测模型训练等提供核心数据支持。

good_rrrrr的博客 1838

FPGA高速通信双核解析:CMAC与Interlaken硬核的实战对比

本文深入对比了FPGA中两大高速通信硬核CMAC与Interlaken的核心差异与应用场景。CMAC作为标准以太网接入方案,适用于网卡、交换机等需对外互联的场景;而Interlaken则以极低延迟和高效通道化能力,专为芯片间、板间裸数据高速传输设计。文章通过实战案例与性能指标分析,为FPGA高速通信方案选型提供清晰指南。

f9g0h的博客 845

Apache MINA (3) NioSocketAcceptor初始化

上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。 服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系。  IoService是对于服务器端接受连接...

happy7744的博客 438

避坑指南:RK3588上编译EtherCAT 1.6时遇到的权限问题和模块安装错误

本文详细解析了在RK3588平台上编译EtherCAT 1.6时常见的权限问题和模块安装错误,提供了两种实战解决方案和嵌入式开发的通用权限管理策略。通过优化内核配置和编译参数,显著提升实时性能,帮助开发者高效完成EtherCAT主站部署。

weixin_33724046的博客 453

Mina工作原理分析

Mina是Apache社区维护的一个开源的高性能IO框架,在业界内久经考验,广为使用。Mina与后来兴起的高性能IO新贵Netty一样,都是韩国人Trustin Lee的大作,二者的设计理念是极为相似的。在作为一个强大的开发工具的同时,这两个框架的优雅设计和不俗的表现,有很多地方是值得学习和借鉴的。本文将从Mina工作原理的角度出发,对其结构进行分析。 总体结构 Mina的底层依赖的...

430

从零上手:基于RK3588平台的RKISP Tuner实战配置与核心功能解析

本文详细介绍了在RK3588平台上使用RKISP Tuner工具进行图像信号处理器(ISP)调试的完整实战流程。从MATLAB运行时环境搭建、服务端部署到核心连接,逐步解析如何通过图形化界面实时调节白平衡、锐化、降噪等参数以优化图像质量。文章重点阐述了实时预览、参数调试、抓图对比及参数保存等核心功能,为开发智能摄像头、机器人等AIoT设备的工程师提供了实用的配置指南与进阶技巧。

js777的博客 631

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

java mina2_mina2线程详解

1主要流程read in data:IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)write out data:业务逻辑处理(IoHandler)---日志记录、编码、threadPool(IoFilter)---IO写出(IoProcessor)由以上可以看出,IO读入和IO写出的过程是相反的。2线...

weixin_42641741的博客 419

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

mina框架源代码研究

转自:http://blog.youkuaiyun.com/gaolingep/archive/2009/05/04/4147697.aspx第一部分:mina各层的关系 图1.1说明IOService:这个接口抽象了一切I/O操作,包括建立端口监听、I/O读写,IOProcessor:为IOSer

小毅的书屋 2636

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

开源服务器openfire研究之开篇

研究目标: 1. 源代码结构; 2. 插件开发; 3.

GeorgeShaw1的专栏 1171

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Mina 源码研究

最近在研究tcp/ip网络通信,但一下子没有找到好的地方下手,于是就先看了看java socket通信,先从nio开始研究,但苦于网上资料都是些简单介绍,于是就直接研究Mina的源码了,废话不多少,下面开始一步一步的分析Mina的源代码 Mina版本为2.09 初始化服务端acceptor...

145

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MINA2 核心源代码分析笔记 - 1. 整体结构与代码分析指引

  2008年7月的一个周末,突发热忱,对刚出了M3版本的MINA2起了兴趣。下载了原码以及一部分资料进行研学。当时,做了一部分笔记。但是由于工作等各种原因一年多没有继续。正直2010年新年新春之际,于家中整理当时的笔记。准备后续慢慢整理出来。 当时的nio网络框架并不多,除了MINA2以外还有国内著名的Cindy。两个框架都作了研学,但是Cindy由于代码注释少、以及资料缺乏,作者也消失

Studying & Summarizing 2282

java mina udp_【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

前言NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文)。本文将演示的是一个基于MINA2的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,MINA2的官方代码里有完整的UDP通信De...

weixin_42535461的博客 311

Openfire源代码

Openfire源代码分析             (运行环境的搭建)   关于Openfire的介绍在此不多说了,网上有很多关于这个基于Java的XMPP服务器的介绍,也可以通Jivesoftware的官方网站www.jivesofteware.com来寻找关于Openfire的信息。  如果研究Openfire的代码,建议第一步在本机上安装Openfire服务器和...

wsyandy 306

Mina源码研究

目录 1. NioSocketAcceptor初始化源码研究 1.1 类图 1.2 方法调用时序图 1.3 初始化NioSocketAcceptor 1.4 SimpleIoProcessorPool初始化分析 1.5 NioProcessor的源码 1.6 总结 2. NioSocketAcceptor bind方法源码研究 2.1 创建ServerSocket监听 2.1....

weixin_30292843的博客 135

mina-core网络应用框架

                                                               mina-core研究总结          mina-core是一个网络应用框架,我们可以从官网上获取到其各种资源,包括jar包,源代码,文档以及使用用例,其官网:http://mina.apache.org/mina-project/userguide/ch2-b...

fxzcollege的专栏 1655

QuickFix/J 源代码研究

http://guibin.iteye.com/blog/853393 QuickFix/J 源代码研究(一) guibin.beijing@gmail.com (〇)QuickFix/J简介 FIX是Financial Information eXchange的简称。FIX是一种专门为实时电子证券交易设计的标准消息协议。FIX协议由FIX protocol, Ltd(FPL)所有并维

l799623787的专栏 6043

MINA及其在高性能通讯应用中的突出问题(NIO架构及应用之二)

MINA及其在高性能通讯应用中的突出问题(NIO架构及应用之二) 博客分类:  MINA 高性能通讯 架构   前面写过一个博文高:高吞吐高并发Java NIO服务的架构,http://maoyidao.iteye.com/admin/blogs/1149015 。这个架构是和MINA一致的,或者可以说MINA是基于同样的思路构架的。想阅读MINA源代码的朋友可用参考这

Stroller 1053

Mina学习的极其有效的推荐方法

转自 iteye  mina_java 关于新手对Mina的学习,本人推荐的方法如下: 一,先了解一下Java NIO。重点是了解Java NIO的设计理念以及重要的几个概念; 二,了解一个Java NIO的现有框架,作个简单的对比; 三,可以正式开始学习Mina了,先看一下官方对Mina的介绍; 四,把Mina的”HelloWorld“跑起来,对应的是官

cluzax的专栏 635

【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

前言 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文)。本文将演示的是一个基于MINA2的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,MINA2的官方代码里有完整的...

hellojackjiang2011的博客 318

Apache Mina 2.0的学习研究(一)

   本人习惯学习新技术时根据API学习实例并在编码时写注释: 今天学习Mina的服务段的编写: 简单明了:   源代码如下: 写道 package cn.com.unutrip.java.opensource.mina.guide; import java.net.InetSocketAddress; import java.util.Date; import org.apache....

topMan'blog 94
上一篇: APACHE MINA研究
下一篇: DB2 &windows机器名
gaolingep
博客等级 码龄20年 1粉丝 16原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值