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

Python多进程实战:用BaoStock高效下载股票历史数据的5个优化技巧 本文详细介绍了使用Python多进程技术通过BaoStock高效下载股票历史数据的5个优化技巧。从理解BaoStock的数据获取机制到进程池配置、智能任务分片、异常处理及性能监控,帮助开发者显著提升数据下载效率,特别适合量化交易领域的数据采集需求。 阅读详情

相关推荐

DGX Spark上PyTorch GPU环境配置实战:CUDA 13.0与ARM架构全流程

在深度学习中,CUDA作为GPU加速计算的底层基础,其版本与深度学习框架(如PyTorch)的匹配直接影响模型训练的效率与稳定性。GPU环境配置不仅涉及驱动、CUDA工具链与框架运行时的协同,还依赖于硬件架构与预构建包的兼容性。在AI开发机Ubuntu系统上,正确对齐CUDA版本、计算能力架构及安装源,是避免环境故障、发挥硬件算力的关键。无论是面向个人AI超算还是通用GPU服务器,掌握版本对齐、路径隔离与验证方法,都能大幅提升开发效率。本文以DGX Spark为例,详解从环境摸底到PyTorch GPU版本

weixin_29483277的博客 220

apache mina:SimpleIoProcessorPool

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

sunning9001的专栏 1510

什么是无人机巡检?如何实现无人机自动巡检?

复亚智能的无人机自动巡检系统通过高度自动化的技术,实现了无人机的高效巡检作业。无人机自动机场支持无人机的自动起降和电池更换,自动飞行算法确保无人机在复杂环境中的精准飞行和拍摄,而云端识别诊断和AI感知算法平台则实现图像的实时传输和智能分析。复亚智能,作为无人机技术的创新者和推动者,致力于开发先进的无人机自动巡检解决方案,助力各行各业实现智能化、自动化的巡检工作,引领智能巡检的未来。利用人工智能和机器学习算法,无人机可以被训练来识别特定的模式和异常,如结构损坏、热泄漏等,从而提高巡检的准确性和效率。

foiadrone的博客 2844

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

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

走向资深架构师的旅程 1339

打开LWIP_DEBUG的打印信息调试

在lwip 2.1.2的版本,打开的debug 调试的步骤: 1.在debug.h 文件中找到debug打印的定义 默认LWIP_DEBUG这个宏没有定义, 2.在lwipopt.h 文件中或者其他文件定义 一下LWIP_DEBUG这个宏, 3.在opt.h 中可以打开各种宏的调试信息, /* --------------------------------------- ---------- Debugging options ---------- ---------...

haidscs的博客 9880

Winform使用TreeView控件实现带复选框的三态树

刚接触c#,项目中用到Treeview实现三态,即选中、未选中、半选中状态,并且要求父子节点选择联动,效果类似下图网上有很多例子,于是研究了一下,结合网上大佬们的例子,所以在这里记录一下。首先新建一个Winform工程拖个TreeView控件,然后运行。。。嗯。。。加点数据吧。private void CreateTree() { TreeNode anime = new TreeNode...

laoyezha的博客 2万+

Apache MINA (3) NioSocketAcceptor初始化

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

happy7744的博客 438

基于STM32L4XX 、HAL库的STSPIN32G4三相无刷直流电机(BLDC)驱动应用C语言程序设计

/ 设置PWM模式为6步换相。│PA5-7 ├── SPI ────►│SCK/MISO│ │ 三相桥 │。– 2路电机控制高级定时器(16位,支持6路 PWM 通道)// 60度电气周期对应转速 = 60/(极对数 * 6 * 周期)// 电气角度(0-3599)

PP_Cottage的博客 147

Mina工作原理分析

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

430

基于Simulink实现电动汽车制动能量回收系统的仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车制动能量回收系统的仿真研究。该系统能够全面评估制动能量回收系统的性能,验证控制策略的有效性,并通过优化设计提高能量回收效率和制动安全性。引入智能预测:结合人工智能技术,实现更智能的能量回收控制策略。扩展功能:增加对多种车型和制动场景的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 336

组合导航 | RTK、IMU与激光雷达组合导航算法:原理、实现与验证

当激光雷达噪声增加至0.1m时,系统位置RMSE仅上升18%,验证了滤波算法的鲁棒性[110]:融合方案在RTK信号丢失30秒后,位置误差仍控制在1.5m内,显著优于IMU单独导航[28]:ESKF框架能有效建模传感器误差特性,状态向量需包含外参与时间偏移等关键参数。:传感器标定精度直接影响系统性能,建议每3个月进行一次重新标定。:IMU预积分与特征匹配是系统实时性的关键瓶颈,需重点优化。:维持10秒窗口内的关键帧,平衡精度与实时性[132]:特征匹配占总耗时的65%,可通过。

尘世冰封的专栏 943

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

【RV1126/RV1109学习笔记】#基础篇#(2)基础入门使用

一、调试方式 1、串口调试 2、ADB调试 3、网络调试 二、基础外设使用 音频使用(aplay,arecord,amixer) 三、WIFI连接 四、屏幕背光控制

丨晋丨 1862

mina框架源代码研究

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

小毅的书屋 2636

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

开源服务器openfire研究之开篇

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

GeorgeShaw1的专栏 1171

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Mina 源码研究

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

145

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、付费专栏及课程。

余额充值