Pennant的日常
分享工作上的点点滴滴

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

posted on 2012-09-20 09:04  汝熹  阅读(372)  评论(0编辑  收藏  举报