接上一讲对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. sass的使用(载)

    一.什么是SASSSASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般使 ...

  2. Flash文字效果

    flash中增加文本.使用了消除锯齿:可读性消除锯齿.发现不嵌入字体的无法动态改动里面的文字,但嵌入字体的话会造成swf文件过大. 终于还是选择了使用设备字体,并选择了黑体.出了一个问题.文字没有加粗 ...

  3. Django1.11.4中文文档

    Django管理站点¶ 自动管理界面是Django最强大的部分之一.它从您的模型中读取元数据,以提供一个快速,以模型为中心的界面,让受信任的用户可以管理您网站上的内容.管理员建议的使用仅限于组织的内部 ...

  4. kubernetes之PDB

    系列目录 上一节我们讲到了由于一些人为的或者不可避免的原因,pod可能会中断,而使用Pod Disruption Budget可以最大限度地保证在pod中断发生时集群仍然保持能够接受的状态. 一句话, ...

  5. Linux 中权限控制实例

    前言 前文对 Linux 中的权限进行了较为透彻的分析.而本文,则在前文的基础上,具体说明如何在代码中进行权限控制. 下面的代码涉及到以下几个方面: 1. 创建文件时设置文件权限 2. 修改文件的默认 ...

  6. postgresql的show databases、show tables、describe table操作

    1.相当与mysql的show databases; select datname from pg_database; 2.相当于mysql的show tables; SELECT table_nam ...

  7. vs2005 未能完成操作。未指定的错误

    具体解决过程是这样的: 1.先把.vcproj 文件剪切到其他地方 2.打开.sln,报错->点“确定”->再点“确定” 3.把 .vcproj 文件 放回来,在vs2008右边的“解决方 ...

  8. MySQL 数据类型转换

    版权个人所有,欢迎转载如转载请说明出处.(东北大亨) http://www.cnblogs.com/northeastTycoon/p/5505523.html 网络越来越达到所以带来的好处不容置疑. ...

  9. IOS 单元测试

    本文转载至 http://blog.csdn.net/fengsh998/article/details/8109293 IOS 自带单元测试. 1.在创建时,将include Unit Tests钩 ...

  10. 使用 QWorker 做为计划任务引擎

    QWorker 提供了 Plan 函数来提供计划任务功能的支持.每个任务做为一个作业,可以在指定的时间点被触发执行.而 cron 作为 Linux 操作系统下计划任务的标准被广大用户所熟知,QWork ...