- 浏览: 120200 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty 源码阅读学习 -
小灯笼:
Netty源码剖析视频教程网盘地址:https://pan.b ...
Netty 源码阅读学习 -
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Apache MINA (2) Hello World! -
smart152829:
很不错的文章,最近看了看了夜行侠老师讲的Netty深入浅出源码 ...
Netty 源码阅读学习 -
liaohb:
为之疯狂的颜值,陶醉天年。
nio Selector 阻塞 唤醒 原理
上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。
服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系。
IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象。IoServer用来执行真正的 I/O 操作,以及管理 I/O 会话。两个子接口为IoAcceptor和IoConnector。IoAcceptor用来接受连接,与客户端进行通讯。IoConnector用来发起连接,与服务端进行通讯。IoAcceptor和IoConnector都分别有基于TCP/IP协议协议,UDP/IP协议以及虚拟机管道通讯的子接口。Hello World例子里面实现的是基于TCP/IP协议的通讯,用了mina默认的实现类NioSocketAcceptor和NioSocketConnector。
首先从服务端的NioSocketAcceptor开始:
1. NioSocketAcceptor的父类为AbstractPollingIoAcceptor,很多实现是在父类中实现的。在构造此类的时候,同时也构造了NioProcessor类
public NioSocketAcceptor() { super(new DefaultSocketSessionConfig(), NioProcessor.class); ((DefaultSocketSessionConfig) getSessionConfig()).init( }
... ... listeners = new IoServiceListenerSupport(this); listeners.add(serviceActivationListener); ... ...AbstractIoService负责初始化了IoServiceListenerSupport监听当前服务相关的事件
protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig, Class<? extends IoProcessor<S>> processorClass) { this(sessionConfig, null, new SimpleIoProcessorPool<S>(processorClass), true); }
SimpleIoProcessorPool
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1; ...... public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType) { this(processorType, null, DEFAULT_SIZE); }
初始化NioProcessor,个数为cpu个数+1,为每个IoProcessor初始化一个默认的Excutor
this.executor = Executors.newCachedThreadPool();
初始化cpu+1个放到private final IoProcessor<S>[] pool 中,用来处理NioSession,所以S为NioSession
public final class NioProcessor extends AbstractPollingIoProcessor<NioSession>…
2. 初始化完SimpleIoProcessorPool,回到AbstractPollingIoAcceptor的构造方法中,调用NioSocketAcceptor中的init()方法打开selector通道,完成NioSocketAcceptor的构造。
3. 然后在上一篇Hello World的例子中设置了SocketSessionConfig的readBufferSize;
接收数据的过滤器,例子中设置的是TextLineCodecFactory(按照行一行为一个单位读取数据);
实现IoHandlerAdapter来处理客户的请求。
4. 最后执行acceptor.bind(new InetSocketAddress(SERVER_PORT)),指定服务提供绑定的端口,同时执行AbstractPollingIoAcceptor中的bindInternal方法,
...... ServerSocketChannel channel = ServerSocketChannel.open(); ......然后配制socket的一些基本属性,并注册此事件是可连接的事件
// This is a non blocking socket channel channel.configureBlocking(false); // Configure the server socket, ServerSocket socket = channel.socket(); // Set the reuseAddress flag accordingly with the setting socket.setReuseAddress(isReuseAddress()); // and bind. socket.bind(localAddress, getBacklog()); // Register the channel within the selector for ACCEPT event channel.register(selector, SelectionKey.OP_ACCEPT);
当接收到请求时调用accept()方法法处理接收连接,把SocektChannel绑定到NioSession中
@Override protected NioSession accept(IoProcessor<NioSession> processor, ServerSocketChannel handle) throws Exception { SelectionKey key = handle.keyFor(selector); if ((key == null) || (!key.isValid()) || (!key.isAcceptable()) ) { return null; } // accept the connection from the client SocketChannel ch = handle.accept(); if (ch == null) { return null; } return new NioSocketSession(this, processor, ch); }
5. 绑定完成后唤醒NIO的selector开始接收请求
selector.wakeup();
初始化过程涉及到的主要类和接口UML图如下:
小结:
通过解析 NioSocketAcceptor的构造方法,bind()等代码大概了解了mina服务端初始化相关的一些信息。
NioSocketAcceptor:主要负责实现nio操作相关的实现如accept(),open(),select()等方法
AbstractIoService:主要负责初始化IoServiceListenerSupport和IoServiceListener
SimpleIoProcessorPool:初始化了一个无界线程池executor,初始化了cpu+1个NioProcessor绑定到executor中
AbstractPollingIoAcceptor:主要负责维护和绑定端口,打开selector通道,初始化内部线程类Acceptor作为服务主线程。
接下来开始了解mina接收处理请求的过程>> Apache MINA (4) 接收处理请求的过程
发表评论
-
Disruptor 学习笔记
2015-04-12 23:06 3543Disruptor 是什么 Disruptor ... -
Zookeeper 笔记
2015-04-12 22:42 1211ZooKeeper ZooKeeper是一 ... -
java jvm笔记
2014-09-26 16:41 01. jconsole 设置环境变量:export DI ... -
Netty 源码阅读学习
2014-09-18 21:40 11066背景 最忌工作中接触到Netty相关应用场景,之 ... -
ThreadLocal
2014-08-05 21:08 506ThreadLocal作用 ThreadLocal提供了 ... -
ReentrantLock AQS 源码阅读笔记
2014-08-05 21:06 1175ReentrantLock是JDK1.5引入的,它拥有与sy ... -
Java 内存可见性与volatile
2014-06-28 23:24 2654在多核系统中,处理 ... -
ubuntu 搭建开发环境
2014-05-04 14:37 0win7 硬盘安装方法: http://diybbs.z ... -
nio Selector 阻塞 唤醒 原理
2014-03-18 16:18 25148Selector:java nio无阻塞io实现的关键。阻 ... -
java nio Buffer 学习笔记
2014-03-17 14:54 1509Buffer 是一个对象, 它 ... -
java nio channel 学习笔记
2014-03-10 23:20 1392Channel直译就是通道的意思,通道表示对数据源头和数据 ... -
java 动态代理
2013-09-25 23:29 1047java的动态代理可以动态的创建并动态的处理所代理的方法调 ... -
java 泛型通配符
2013-09-25 23:25 914泛型是Java SE 1.5的新特性,泛型的本质是参数化类 ... -
java堆和栈
2013-09-23 22:58 904Java把内存划分成两种 ... -
Java nio 基础概念笔记
2012-12-27 12:09 1181Channel: ServerSocketChanne ... -
Apache MINA (4) 接收处理请求的过程
2012-12-23 23:50 8540上一篇博客 Apache MINA (3) NioSocket ... -
Apache MINA (2) Hello World!
2012-07-26 23:40 5182了解完Apach MINA的一些基本概念Apache MINA ... -
Apache MINA (1) 简介
2012-07-26 22:14 2398简介: Apache MINA(Mult ... -
BufferedInputStream 源码学习笔记
2012-06-17 19:01 9572BufferedInputStream 是一个带有内存缓冲的 ... -
java 反射内部类
2011-01-17 22:05 4525内部类的初始化同一般类的初始化基本相同,只是内部类的类名全称有 ...
相关推荐
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_...
Apache MINA 线程模型配置 Mina配置
这个是我学的apache mina2.0学习笔记的实例
Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...
收集整理的Apache Mina chm pdf教程和帮助文档
Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。 apache-mina-2.0.7-bin.zip,apache-mina-2.0.7-src.zip,log4j-1.2.17.zip,slf4j-api-1.6.6.jar,slf4j-api-1.6.6-...
apache mina的入门完整学习资料,附加中文参考手册。
apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例
Apache MINA2实用手册 Apache MINA2实用手册
一个Apache MINA使用案例源代码ApacheMina
apache mina实例免费下载,有很多实例代码简单易懂欢迎大家下载!
Apache MINA 2.0 用户指南
最新的Apache Mina v2.0.8 API手册,chm格式,2014年9月下旬制作。
apache mina chm 格式的api帮助文档。
最近做rfid读写,C#和java都用udp不用厂家的动态库,udp自己写也简单,但是试了一下Apache mina ,接收的不是string,二十byte[] 数组,简单实现了UDP,网上也有例子,但是不是我要的。可用。
很详细的描述了apache mina 框架,对于那些对于英文不是很懂得人,这简直就是福音啊,哈哈
本资源包含两个 pdf 文档,一本根据官方最新文档 (http://mina.apache.org/mina-project/userguide/user-guide-toc.html) 整理的 mina_2.0_user_guide_en.pdf,一个中文翻译的 mina_2.0_user_guide_cn.pdf。...
最近一直在看 Mina 的源码,用了 Mina 这么长时间,说实话,现在才开始对 Mina 有了一 些 深刻的理解,关于 Mina 的基本知识的介绍,这里就不多说了,网上已经有很多不错的文 章 都对 Mina 做了较深刻的剖析,现在...
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...