mina框架之---服务端NioSocketAcceptor的学习
接上一讲对mina的简单应用和对mina服务端和客户端中几个重要的技术知识点的理解后,今天着重对mina服务端的NioSocketAcceptor 进行学习。
说这个玩意之前,先整体上看一下在mina框架中NioSocketAcceptor和NioSocketConnector 这两个玩意的整体代码结构:

从上面的代码结构我做如下的解释:
服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求。
IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象。IoServer用来执行真正的 I/O 操作,以及管理 I/O 会话。两个子接口为IoAcceptor和IoConnector。IoAcceptor用来接受连接,与客户端进行通讯。IoConnector用来发起连接,与服务端进行通讯。IoAcceptor和IoConnector都分别有基于TCP/IP协议协议,UDP/IP协议以及虚拟机管道通讯的子接口。
上面是NioSocketAcceptor和NioSocketConnector的一个类的结构,现在我们从服务端先来说:先看一下服务端的代码继承和接口:

在这里我们知道我们想使用mina的时候就是先从一个NioSocketAcceptor定义开始,定义NioSocketAcceptor的时候需要绑定或者指定其对应的过滤器,IOHandler处理器,线程池等等。从源码中我们可以知道NioSocketAcceptor的方法的入口是linstener,结束的出口是dispose()。哪我们就从一个NioSocketAcceptor的定义开始。

首先看一下我们定义开始的地方跟我们上一讲中实现一个mina服务端编写是一样的。在这里我们重点来看我们实现了一个MinaSocketServer的接口,而这个接口中只有两个方法

我们从listener的方法中可以看到是这样的实现,定义一个NioSocketAcceptor,指定过滤链,iohandler处理器,绑定端口。我们就先从初始化的NioSocketAcceptor来说,先看NioSocketAcceptor的new操作》

我们可以看到对NioSocketAcceptor的初始化创建的时候是传入了一个SimpleIoProcessorPool对象,而其中有NioProcessor和一个线程池,对这两个的解释我们先放到后面,先来看nioSocketAcceptor的构造函数源码:

在这个代码中我们需要注意一下哈 这里的这个selector是用volatile来修饰的,这样在线程每次使用的时候,都会读取变量修改后的最的值。想想这是为什么。或者在面试的时候人家问你在什么地方见到过这个词,知道了吧,这就是我们读源码的好处,到时候说不上你的面试官都不知道^_^
在这里我们只是看到的nioSocketAcceptor的实现:下面是父类的实现以及解释:

而在子类的init实现方法中我们可以看到做了如下的操作:

也就是打开一个选择器,说到这里我们想大家应该有点印象了,因为在我们之前将nio的时候我们知道在NIO中就是这个Secletor对管道进行管理的,也就是这个selector是一个类似于服务端和客户端管道大管家的角色,在这个secletor上注册了不同的事件,来相应。那么在这里我们知道是打开了这个secletor。哪可能你会问,哪我到这里换没有看到你的管道channel,selector等等的创建啊,好,其实我也是这么想的,别忘了在nioSocketAcceptor这个类的父类AbstractPollingIoAcceptor的构造方法中我们又去调用了AbstractPollingIoAcceptor的父类的构造方法,哪这个时候我们就去看看再哪里mina做了什么。
。。。不好意思在刚才说AbstractPollingIoAcceptor的构造函数的时候忘了说明一点就是在AbstractPollingIoAcceptor的构造函数中对NioProcessor进行了绑定,绑定有什么用呢,我们先看父类的构造函数中做了什么,再来说NioProcessor的用途。源码加解释:
是不是很扫兴,这都已经是第三个父类了,怎么还没有具体的实现,别灰心我们继续往下跟,其实这个时候我们应该去想想,mina为什么这样写代码,为什么要在父类的父类中取实现具体的操作,也许这也是一个设计模式或者模板,在这里我提出这个问题来咱们都去考虑考虑人家的代码为什么这样写.哪在这里我们还是接着来跟源码吧:

好了今天对mina服务端服务创建的一个过程做了一个大致简单的介绍,其实并不是很详细。我们目前暂时知道nioSocketAcceptor这个类的继承及实现接口的关心,以及知道在初始化的过程中每个类是负责干什么的。下节我们重点对这个的细节进行一个学习介绍。对细节学习介绍后,我们就开始对客户端请求到来的时候mina是如何处理这个请求的,我们知道在原生态的NIO中是通过selector这个大管家通关SelectionKey这个注册的时间来监听到是哪个通道发生的什么事件,然后我们根据发生的事件去做相应的操作,比如我们检测到通道现在可读,哪我们就从byteBuffer中将缓存的数据读出来。好了今天就到这里吧,我的脑袋现在也有点晕晕的,待我好好理理再跟大家细细道来。明天见,一会换有一个设计模式--适配器模式的学习和博客的编写。哎。。。革命尚未成功兄弟们还需努力啊。
mina框架之---服务端NioSocketAcceptor的学习的更多相关文章
- 使用Apache MINA框架搭建服务端
使用MINA框架搭建服务端步骤: 1.定义一个启动服务的类MinaServer,并实现接口ServletContextListener 2.定义一个处理业务逻辑的类MinaServerHandler, ...
- Mina airQQ聊天 服务端篇(二)
Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求 ...
- .Net Mvc3框架调用服务端控件解决方案
/*BY:Wangyexin date:2011年4月30日 20:17:38*/ /*说明:.net mvc3框架,View层调用服务端控件,输出到.cshtml文件中显示*/ 1.先说说.ne ...
- mina客户端与服务端通信的易错点
使用mina进行项目开发时,如果客户端与服务端不在同一个项目下,需要关注一下两点: 第一.服务端与客户端的编码解码器一致 第二.过程中所用到的实体类的包名需要一致
- ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用
缓存在一个大型一点的系统里面是必然会涉及到的,合理的使用缓存能够给我们的系统带来更高的响应速度.由于数据提供服务涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发 ...
- Delphi 三层框架开发 服务端开发
采用Delphi7+SQL2008 一.创建数据库和表 CREATE TABLE [dbo].[tb_Department]( [FKey] [uniqueidentifier] NOT NULL, ...
- RPC框架 - thrift 服务端
-------服务端程序 ------ 下载 下载 thrift 源代码包 下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件) \thrift-0.10.0\tu ...
- C# SuperWebSocket服务端、客户端学习(三)
1.打开VS2012,新建一个windows窗体程序,选择.NET4.0版本 2.添加引用 SuperSocket的dll文件( SuperSocket.Common.dll, SuperSocket ...
- 服务端相关知识学习(二)之Zookeeper可以干什么
Zookeeper主要可以干哪些事情 配置管理,名字服务,提供分布式同步以及集群管理.那这些服务又到底是什么呢?我们为什么需要这样的服务?我们又为什么要使用Zookeeper来实现呢,使用Zookee ...
随机推荐
- 【随想】android是个什么东西,andorid机制随想
优秀程序猿的天性就是好奇,软件是怎么运作的.屏幕是怎样显示的.桌面窗口为何能如此人性化的被鼠标拖动? 假设你常常会有这样一些问题迸发在脑海中,恭喜你,你是一名非常有潜力的程序猿. 我在大学读的是自己主 ...
- Hdu-1565 方格取数(1) (状态压缩dp入门题
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 笔记09 WS,WCF
http://blog.csdn.net/avi9111/article/details/5655563 http://www.cnblogs.com/tearer/archive/2013/04/2 ...
- vim 宏的使用
1. 基本使用 q[a-z] 开始录制宏 q 停止录制 @[a-z] 使用宏 @@ 调用最近使用的宏 22@[a-z] 多次重放宏 2. 宏的执行方式 串行方式:5@[a-z] 宏内包含向下一个目标 ...
- 实例讲解SVN分支和合并问题(转)
本节向大家简单描述一下SVN分支和合并方面的知识,在学习SVN的过程中SVN分支和合并时经常遇到的问题,在这里和大家分享一下,希望本文对大家有用. 关于主线同SVN分支合并的概念及如何使用的误区此问题 ...
- hdu4455 dp
pid=4455">http://acm.hdu.edu.cn/showproblem.php?pid=4455 Substrings Time Limit: 10000/5000 M ...
- iOS设备控制打印机输出文本
本文转载至 http://tec.5lulu.com/detail/108krn1e6e66m8sbd.html 让我们来看看是如何实现的吧,首先要知道打印机的ip地址,然后用socket通过打印机的 ...
- asp.net c# select 动态加载数据
1.说明通过 asp.net,利用jQuery ,c#语言给 select控件动态加载数据.前端页面使用的是.aspx类型的HTML页面,后台使用MVC上的controller控制器 2.webcon ...
- java中Integer在JDK1.6和JDK1.7中的区别
运行下面这段代码: System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); Sy ...
- Linux随笔-鸟哥Linux基础篇学习总结(全)
Linux随笔-鸟哥Linux基础篇学习总结(全) 修改Linux系统语系:LANG-en_US,如果我们想让系统默认的语系变成英文的话我们可以修改系统配置文件:/etc/sysconfig/i18n ...