3.4接受器 - 连接器(Acceptor - Connector)

1.问题

在面向连接的网络化系统中,应用程序通常包含相当大量的用于建立连接和初始化服务的配置代理。这些配置代码大多独立于服务对在连接传输端点之间交换的数据所进行的处理。因此配置代码与服务处理代码之间紧密耦合是不理想的,因为这样不能解决以下四个强制条件:

1)它应该很容易地改变连接角色,以支持不同的应用特征。

2)应很容易地增加服务,服务实现和通信协议的种类,而不影响已有的连接建立和服务初始化配置代码。

3)连接建立和服务初始化策略的改变要比应用程序实现的通信协议和服务的改变频率少。

4)对大规模网络化系统,应能通过使用高级的操作系统特性,如异步连接机制来降低连接建立延迟。

2.解决方案

将网络化应用中对等体服务的连接和初始化工作,与连接和初始化后这些服务所执行的处理分开。

具体地说:在对等体服务处理程序中封装应用服务。每个服务处理程序实现网络化应用中端到端的一半服务。使用两个工厂连接和初始化对等体服务:接受器和连接器。这两个工厂相互合作,创建在两个对等体服务处理程序与它们的两个连接的传输端点之间的全关联,每个传输端点封装在一个传输句柄中。

接受器工厂代表相关的对等体服务处理程序,在由远程对等体服务处理程序发出的连接请求事件到达后被动地建立连接。反过来,连接器工厂代表对等体服务处理程序主动地与指定的远程对等体服务处理程序建立连接。

连接建立后,接受器和连接器工厂初始化相应的对等体服务处理程序,向它们传送各自的传输句柄。然后对等体服务处理程序使用传输句柄通过连接的传输端点交换数据,进行与应用有关的处理。一般来说,在连接和初始化后,服务处理程序并不与接受器和发送器交互。

3.结构

被动模式的传输端点是一个工厂,它侦听连接请求,接受连接请求和建立传输句柄,传输句柄中封装了新连接的传输端点。可以通过连接的传输端点读写相应的传输句柄来交换数据。

服务处理程序定义了网络系统中端到端的一半服务。在这个端到端的服务中一个具体的服务处理程序通常既具有客户机角色又具有服务器角色。在对等使用的情况下,它可以同时扮演这两个角色。一个服务处理程序提供了一个激活钩子方法,用于在连接到其对等体的服务处理程序后进行初始化。另外,服务处理程序还包括一个封闭传输端点的传输句柄,如数据模式套接字句柄。一旦连接上,服务处理程序就使用传输句柄与对等体服务处理程序通过它们的连接传输端点交换数据。

接受器是一个工厂,它实现的功能包括被动地建立被连接的传输端点,创建和初始化相关的传输句柄和服务处理程序。一个接受器提供两个方法:连接初始化和连接完成,这两个方法在被动模式传输端点的帮助下实现上述功能。

调用初始化方法时,接受器将被动模式传输端点绑定到一个传输地址上,如一个TCP端口号和IP主机地址,它被动地侦听连接请求。

当连接请求到达时,接受器的连接完成方法执行下面3个步骤:

·首先,它用被动模式传输端点创建一个连接的传输端点,并在传输句柄中封装该端点。

·第二,它创建一个服务处理程序,用于处理对等体服务处理程序通过连接的传输端点发出的数据请求。

·第三,它将传输句柄存储在相应的服务处理程序中,然后调用服务处理程序的激活钩子方法,该方法让服务处理程序自己完成初始化。

连接器也是一个工厂,它实现的功能包括主动地建立连接的传输端点,初始化其相应的传输句柄和服务处理程序。它提供2个方法:连接启动和连接完成方法。

向连接启动方法传给一个已有的服务处理程序,该方法为它和接受器建立一个连接的传输端点。正如前面介绍的,该接受器一定正在侦听在某一传输地址上的连接请求。

将连接器的连接启动方法和完成方法分开,这样可以使连接器支持透明的同步和异步的连接建立。

·对于同步的情况,激活连接请求的连接器阻塞其调用者,直到传输端点被连接上。以后,连接器直接调用服务处理程序的激活钩子方法。

·对于异步的情况,异步运行连接请求,连接器的激活方法立即返回。只有在连接器得到传输端点已异步地完成了连接的通知后,连接完成方法才激活服务处理程序。

无论是同步还是异步地连接传输端点的,在连接上传输端点事,接受器和连接器都通过调用其激活钩子方法来初始化一个服务处理程序。以后,服务处理程序一般不需要与连接器和接受器工厂交互。

分配器负责多路分解表示不同类型服务请求(如连接请求和数据请求)的指示事件。

·对于接受器,分配器多路分解从封装传输端点的一个或多个传输句柄中接收来的连接指示事件。多个接受器可以注册同一个分配器,分配器替它们侦听来自于对等体连接器的连接请求。

·对于连接器,分配器多路分解因响应异步激活的连接而到达的完成事件。为了处理这种情况,连接器向一个分配器注册它自己,以接收这些连接完成事件,然后分配器运行它的事件循环。当完成事件到达时,它通知相应的连接器。然后连接器调用指定的服务处理程序的激活钩子方法,让服务处理程序来初始化自己。因此,一个分配器和连接器可以代表多个服务处理程序异步地激活和完成连接。

注意,异步连接建立不需要使用分配器,因为启动连接的线程会因等待连接完成事件而阻塞。因此,该线程可以直接激活服务处理程序。

具体的服务处理程序定义与应用有关的部分端到端服务,由具体接受器或具体连接器激活这部分服务。具体接受器用具体服务处理程序。传输端点和这些服务处理程序使用的传输句柄来实例化通用接受器。类似地,具体连接器也实例化通用连接器。

4.实现

接受器 - 连接器模式中的各组成部分可以分解成以下三层:

·多路分解/分配基础设施层组件。该层执行通用的与应用无关的事件分配策略。

·连接管理层组件。该层执行通用的与应用无关的连接和初始化服务。

·应用层组件。该层对上两层的通用策略进行定制,它使用了子类派生,对象组合和/或参数化类型的实例化等方法,以创建具体组件这些具体组件用于建立连接,交换数据和执行与服务有关的处理。

1)实现多路分解/分配基础设施组件层。

1.1)选择传输机制,这些机制包括:

·被动模式传输端点组件。

·连接的传输端点组件。

·传输地址组件。

·传输句柄组件。

1.2)实现分配机制。这些机制由分配器和事件处理程序组件组成。分配器负责将请求与对应的接受器,连接器和服务处理程序联系起来。事件处理程序定义了由事件驱动的应用程序中服务所提供的事件处理接口。

2)实现连接管理组件层。本层负责创建服务处理程序,主动或被动地将服务处理程序连接到远程服务处理程序上,以及在连接后激活服务处理程序。这一层的所有组件都是通用的,并依赖于具体的IPC机制,具体的服务处理程序,具体的接受器和具体的连接器。在连接管理层中有三个主要的组件:服务处理程序,接受器和连接器。

2.1)定义通用的服务处理程序接口。服务处理程序提供了一个通用的接口,它是由客户机,服务器或者在端到端的服务中两者(客户机和服务器)共同定义的服务。该接口包括初始化服务处理程序,执行它定义的服务以及维护用于通信的IPC机制等方法。

2.2)定义一个通用的接受器接口。接受器组件中实现一个通用的策略,该策略用于被动地建立连接,建立的初始化具体的服务处理程序,这些具体的服务处理程序利用这些连接与对等体服务处理程序交换数据。接受器中也定义一个初始化方法,供应用程序调用这个方法,用于向网络中其他应用程序通告它的被动模式传输端点。

2.3)实现通用的接受器方法。应用程序通过调用其初始化方法来初始化接受器。调用初始化方法时要有一个指明传输地址(如本地主机IP名和TCP端口号)的参数。接受器使用这个地址参数侦听对等体连接器启动的连接请求。它通过接受器的具体接受器子类或通过类型化参数将这个地址传递给配置到通用接受器中的具体IPC连接机制。然后IPC连接机制就初始化接受器的被动模式传输端点,将它的地址告知要与该接受器建立连接的远程应用程序。

2.4)定义通用的连接器接口。连接器组件实现了用于主动建立连接和初始化服务处理程序的通用策略,这些服务处理程序负责处理连接上的请求和响应事件。

2.5)实现通用连接器方法。应用程序用连接器的connect()方法来启动一个连接,具体连接器可以使用该模板方法,在不改变连接器接口和实现的情况下透明地修改主动连接策略。因此,connect()将其连接策略中的具体步骤交给钩子方法去完成,具体连接器可以重载这些钩子方法以进行个性化的操作。

3)实现应用层的组件。本层实现具体服务处理程序,具体接受器和具体连接器。

5.结论

优点:

1)可重用性,可移植性和可扩展性。接受器 - 连接器模式将连接和初始化服务处理程序的机制与在此之后进行的服务处理分开。接受器和连接器中与应用无关的机制是可重用的组件。

2)健壮性。接受器 - 连接器模式将服务处理程序与接受器分开。这种分离能确保被动模式传输端点不能用于读/写数据。这种增加了类型安全性,能消除使用弱类型的网络编程接口时经常会出现的一类错误。

3)高效性。接受器 - 连接器模式可以在延迟很大的广域网中异步地和高效地与大量主机主动地建立连接。

不足:

1)增加了间接性。与直接使用底层的网络编程接口相比,接受器 - 连接器模式是不直接的。

2)增加了复杂性。对于只连接到一个服务器,使用单一网络编程接口执行一个服务的简单客户机应用程序,接受器 - 连接器模式增加了不必要的复杂性。不过使用通用的接受器和连接器包装器外观可以使开发人员不用考虑令人厌烦的,易出错的和不可移植的低层网络编程机制,从而简化了应用程序的设计。

转载于:https://www.cnblogs.com/pennant/archive/2012/09/20/2693090.html

《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(10)--- 接受器 - 连接器...相关推荐

  1. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(7)--- 事件处理模式与反应器...

    事件处理模式 使用反应器(Reactor)结构化模式,事件驱动的应用可以多路分解并分配从一个或者多个客户机发送给应用的服务请求.反应器模式引入的结构"逆转"了应用中的控制流,这就是 ...

  2. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(3)--- 服务访问和配置模式...

    服务访问和配置模式 包装器外观(Wrapper Facade)设计模式把现有的非面向对象的API所提供的函数和数据,封装在更加简洁的.健壮的.可移植的.可维护的和内聚的面向对象的类接口里面.常常应用包 ...

  3. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(12)--- 策略化加锁...

    4.2策略化加锁(Strategized Locking) 1.问题 运行在多线程环境中的组件必须保护其临界区不被客户机并发访问.同步机制与组件功能的集成需要解决以下两个强制条件: 1)不同的应用程序 ...

  4. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(17)--- 领导者/追随者...

    5.4领导者/追随者(Leader/Follower) 1.问题 多线程是实现并发处理多事件的应用程序的一种常用技术.然而,很难实现高性能的多线程服务器应用程序.这些应用程序通常处理大量同时到达的多类 ...

  5. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(13)--- 线程安全接口和双检查加锁优化...

    4.3线程安全接口(Thread-Safe Interface) 1.问题 多线程组件通常包括多个可被公共访问的接口方法以及可以改变组件状态的私有方法.为了避免出现竞争条件,可以使用一个组件内部的锁对 ...

  6. 面向模式的软件体系结构(卷1-5

    面向模式的软件体系结构(卷1-5 [一日养生24法].宋爱莉.插图版.pdf: http://www.t00y.com/file/60331740 [一桶金]--颠覆传统赚钱方式的系统创富法则.艾莫. ...

  7. 面向模式的软件体系结构

    面向模式的软件体系结构,卷2,详细介绍并发网络服务器 C 语言常见问题集 转载于:https://www.cnblogs.com/unixshell/p/3825490.html

  8. 《软件建模与设计: UML、用例、模式和软件体系结构》一一2.10 UML扩展机制

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第2章,第2.10节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章 ...

  9. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.1 软件生存周期模型...

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第3章,第3.1节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章计 ...

  10. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认...

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第3章,第3.2节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章计 ...

最新文章

  1. 适合初学者的数据结构_数据结构101:数组-初学者的直观介绍
  2. 盘点 Github 上的高仿 app 项目
  3. Android我的便签-----SQLite的使用方法
  4. 一个服务器上配置多个tomcat
  5. wincc 报警记录 mysql_wincc查询历史报警记录,归档数据-工业支持中心-西门子中国...
  6. 19生成材料清单_SOLIDWORKS 钣金装配体材料明细表扩展应用
  7. 10-10-010-简介-官网-官网翻译
  8. Flask Jinja2模板
  9. TensorBoard 1.15.0 at http://DESKTOP-DV74NQ2:6006/ 打开html后无法展示解决方案
  10. 呕心沥血 JavaScript知识点梳理大全,超详细 建议收藏!!!
  11. mysqls为node.js而编写的sql语句生成插件 crud for mysql.
  12. xpdf 打开 chinapub中文pdf
  13. 十大排序算法之二路归并排序(难点为对于递归的理解)
  14. python平方数_python数字平方
  15. 三个“清洁代码”技巧将使您的开发团队效率提高 50%
  16. math_数集(数集符号)/算数运算中英文对照
  17. 弘辽科技:商家直通车操作
  18. Tensorboard报错的解决
  19. nginx详细文档 – 安装配置,深入源码,模块编写,编译器参数,系统函数
  20. 基于java+SpringBoot+HTML+Mysql学生宿舍管理系统

热门文章

  1. 剥开比原看代码03:比原是如何监听p2p端口的
  2. 修改maven默认仓库(即repository)的路径
  3. github创建远程仓库
  4. Swift之动画总结
  5. 提高开发效率的 Eclipse 实用操作
  6. Java byte变成无符号整数~~~
  7. GNU Make笔记
  8. svg的viewport和viewbox
  9. UVALive 7274 Canvas Painting (优先队列)
  10. 数据库热备之SQLServer的数据库镜像实施笔记