接上一讲对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的学习的更多相关文章

  1. 使用Apache MINA框架搭建服务端

    使用MINA框架搭建服务端步骤: 1.定义一个启动服务的类MinaServer,并实现接口ServletContextListener 2.定义一个处理业务逻辑的类MinaServerHandler, ...

  2. Mina airQQ聊天 服务端篇(二)

    Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求 ...

  3. .Net Mvc3框架调用服务端控件解决方案

      /*BY:Wangyexin date:2011年4月30日 20:17:38*/ /*说明:.net mvc3框架,View层调用服务端控件,输出到.cshtml文件中显示*/ 1.先说说.ne ...

  4. mina客户端与服务端通信的易错点

    使用mina进行项目开发时,如果客户端与服务端不在同一个项目下,需要关注一下两点: 第一.服务端与客户端的编码解码器一致 第二.过程中所用到的实体类的包名需要一致

  5. ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用

    缓存在一个大型一点的系统里面是必然会涉及到的,合理的使用缓存能够给我们的系统带来更高的响应速度.由于数据提供服务涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发 ...

  6. Delphi 三层框架开发 服务端开发

    采用Delphi7+SQL2008 一.创建数据库和表 CREATE TABLE [dbo].[tb_Department]( [FKey] [uniqueidentifier] NOT NULL, ...

  7. RPC框架 - thrift 服务端

    -------服务端程序 ------ 下载    下载 thrift 源代码包    下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件)    \thrift-0.10.0\tu ...

  8. C# SuperWebSocket服务端、客户端学习(三)

    1.打开VS2012,新建一个windows窗体程序,选择.NET4.0版本 2.添加引用 SuperSocket的dll文件( SuperSocket.Common.dll, SuperSocket ...

  9. 服务端相关知识学习(二)之Zookeeper可以干什么

    Zookeeper主要可以干哪些事情 配置管理,名字服务,提供分布式同步以及集群管理.那这些服务又到底是什么呢?我们为什么需要这样的服务?我们又为什么要使用Zookeeper来实现呢,使用Zookee ...

随机推荐

  1. mysql truncate table命令使用总结

    truncate使用注意 由于上过truncate table a_table命令一次当,将教训记录下来,以示警戒!     mysql truncate table a_table命令受影响结果说明 ...

  2. 剖析CPU温度监控技术

    转载 :剖析CPU温度监控技术   标签: CPU 温度控制技术 1805 具体温度检测调整代码(转载)        迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的“芯”,往 ...

  3. java对象访问

    下面这句代码: Object obj = new Object(); 对象引用在栈中,对象实体存在堆中,引用的方式有两种,分别是通过句柄访问对象和通过直接指针访问对象. Sun HotSpot使用第二 ...

  4. 日常沟通的 3 种模式zz

    一.日常沟通的 3 种模式 根据NLP (Neuro-Linguistic Programming,神经语言程序学),日常沟通的 3 种模式分别是:上堆.下切和平行,它们是什么意思呢? 1.上堆 意思 ...

  5. css-装饰

    css -在标签上设置style样式 background-color:#2356a1 height:48px -编写样式方法 1.标签的style属性 2.鞋子head里面,style标签中编写 - ...

  6. Matlab中图片保存的四种方法

    matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的.Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具箱 ...

  7. IOS 为UILabel添加长按复制功能

    IOS 为UILabel添加长按复制功能 在iOS中下面三个控件,自身就有复制-粘贴的功能: 1.UITextView 2.UITextField 3.UIWebView UIKit framewor ...

  8. Markdown 语法的超快速上手

    本文支持WTFPL协议,因此你想往哪转就往哪转. Why markdown? Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Ma ...

  9. API网关如何实现对服务下线实时感知

    上篇文章<Eureka 缓存机制>介绍了Eureka的缓存机制,相信大家对Eureka 有了进一步的了解,本文将详细介绍API网关如何实现服务下线的实时感知. 一.前言 在基于云的微服务应 ...

  10. jquery设置多个css样式

    $(selector).css({property:value, property:value, ...}) 实例: $("p").css({ "color": ...