终于又有时间和精力来写写东西啦,真开心~
这两天闲来没事翻了翻Mina的源码,小有感触,于是决定简单分享一下。
从服务端出发来分析一下吧。Mina有这么几个核心的接口类:
IoAcceptor: 启动server段监听,启动Acceptor线程,处理连接请求同时生成IoSession并放到一个数组里面。
IoProcessor: 启动Processor线程。循环处理上面提到的数组里面的IoSession. 该读读,该写写。
IoSession: 客户端和服务端的会话抽象
IoFilter: Mina用来处理消息的节点链中的节点
IoHander: Mina事件监听类。通常也是客户化开发需要扩展的基础接口。
闲言少叙,上一张自己画的sequence 图。因为是第一次画这种图,如有不妥请童鞋们指正~
哈哈通过这张图,什么Nio啊,异步什么的就比较能够明显看出来了。
至于NIO,在NioAcceptor里面,对连接请求的处理是通过Selector来实现的。具体可参考java NIO.
至于异步,可以发现,实际上的读写都是最终通过Processor来实现的。客户端的读写都是放到一个队列里面,
Processor 不断loop以完成对队列读写的实际操作并且在完成时设置FutureOperation的标志位。
还有一些细节的东西,比如Acceptor是只有一个线程,而Processor是有多个线程的。默认情况下Processor的线程数是
主机CPU个数+1 。
这个的原理是:
为了以下描述的清晰性,先贴一下Demo 代码,以方便以下的分析:
public static void main(String[] args) throws Exception {
SocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.setReuseAddress( true );
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
// Add SSL filter if SSL is enabled.
if (USE_SSL) {
addSSLSupport(chain);
}
// Bind
acceptor.setHandler(new EchoProtocolHandler());
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listening on port " + PORT);
for (;;) {
System.out.println("R: " + acceptor.getStatistics().getReadBytesThroughput() +
", W: " + acceptor.getStatistics().getWrittenBytesThroughput());
Thread.sleep(3000);
}
}
在AbstracePoolingIoAcceptor构造的时候,传入的processor 是一个SimpleIoProcessorPool的实例,这个类的作用就是维护一个默认CPU+1数量的IoProcessor池。入口如下:
protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
Class<? extends IoProcessor<T>> processorClass) {
this(sessionConfig, null, new SimpleIoProcessorPool<T>(processorClass),
true);
}
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
public SimpleIoProcessorPool(Class<? extends IoProcessor<T>> processorType) {
this(processorType, null, DEFAULT_SIZE);
}
每次调用IoProccesor(在我们的例子里面是SimpleIoProcessorPool)的add方法的时候,会随机从IoProcessor池里面取一个实例然后与要add的session关联。于是实际调用的就是NioProcessor的add方法. 通过这种方式,每个被调用过的IoProcessor都会启动一个自己的Processor线程。
贴一下为add过程的源码:
SimpleIoProcessorPool 类
public final void add(T session) {
getProcessor(session).add(session);
}
private IoProcessor<T> getProcessor(T session) {
IoProcessor<T> processor = (IoProcessor<T>) session.getAttribute(PROCESSOR);
if (processor == null) {
processor = nextProcessor(session);
session.setAttributeIfAbsent(PROCESSOR, processor);
}
return processor;
}
private IoProcessor<T> nextProcessor(T session) {
if (disposed) {
throw new IllegalStateException(
"A disposed processor cannot be accessed.");
}
return pool[Math.abs((int)session.getId()) % pool.length];
}
通过代码很清晰的能够看到, 实际上的add 调用还是NioProcessor的 add 调用。
分享到:
相关推荐
Mina2源码分析,学习mina不可多得的文档资料
mina 的源码,并对源码中的一些接口的作用进行讲解
Mina源码解析 ,有兴趣的下载看一下,很不错的。
可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式,是一个开发高性能和高可伸缩性网络应用程序的网络应用框架的源码.
Mina2源码分析,mina2框架。mina nio框架。mina用于webgame游戏开发很多。
java Mina2源码分析
Mina2.0框架源码剖析
mina框架 运用封装socket 行一系列的
Mina快速入门,学习笔记和源码剖析,中文参考以及API
MINA开发文档总结,有如下内容Apache_Mina_Server_2.0中文参考手册V1.0.pdf 深入理解Apache_Mina.pdf MINA2官方教程翻译.pdf Mina2源码分析.pdf
包括中文参考手册,mina2的源码分析,api文档,MINA和spring结合等相关资料
从源码和网上资料,总结了Mina2与Netty4的区别,主要是分析线程模型的Buffer,还提到了Netty4中引入的Google的优秀的序列化工具ProtoBuf
04、第四课netty线程模型源码分析(一) 05、第五课netty线程模型源码分析(二) 06、第六课netty5案例学习 07、第七课netty学习之心跳 08、第八课protocol buff学习 09.第九课自定义序列化协议之自定义序列化协议 ...
集合源码分析计算机开放电子书汇总 100个gcc小技巧 100个gdb小技巧 关于浏览器和网络的20 项须知 2015互联网企业校招笔试题 3周3页面 简明Python 教程 A Guide to HTML5 and CSS3 ANSI Common Lisp 中文翻译版 ...
基于JAVA开发语言,采集设备音频,通过Mina socket通讯,使用UDP协议传输音频数据,实现通话功能。
基于微信小程序的todo番茄钟设计与实现(源码+说明文档+演示视频) 第二章 微信小程序相关技术综述 9 2.1. 微信小程序介绍 9 2.1.1. 微信小程序背景 9 2.1.2. 微信小程序特点分析 9 2.2. 框架技术介绍 11 2.2.1. MINA...
如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下Jetty、Tomcat和Mina有关NIO的源码,发现大伙都基于类似的方式,我感觉这应该算是NIO构架网络服务器的经典模式,并基于这种模式写了个...
2.2.2MINA简介 3需求分析和总体设计 3.1商城系统可行性分析 3.2系统功能分析 3.3系统用户模块分析 4数据库设计 4.1数据库名 4.2具体数据表 5系统设计与实现 5.1首页模块 5.2商品详情模块 5.3商品分类模块 5.4购物车...
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...