欢迎来到天天文库
浏览记录
ID:11622447
大小:265.50 KB
页数:56页
时间:2018-07-13
《第7章接受器(acceptor)和连接器(connector)连接建》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第7章接受器(Acceptor)和连接器(Connector):连接建立模式接受器/连接器模式设计用于降低连接建立与连接建立后所执行的服务之间的耦合。例如,在WWW浏览器中,所执行的服务或“实际工作”是解析和显示客户浏览器接收到的HTML页面。连接建立是次要的,可能通过BSDsocket或其他一些等价的IPC机制来完成。使用这些模式允许程序员专注于“实际工作”,而最少限度地去关心怎样在服务器和客户之间建立连接。而另外一方面,程序员也可以独立于他所编写的、或将要编写的服务例程,去调谐连接建立的策略。 因为该模式降低了服务和连接建立方法之间的耦合,非常容易改动其中一个,而不影响另外一个,
2、从而也就可以复用以前编写的连接建立机制和服务例程的代码。在同样的例子中,使用这些模式的浏览器程序员一开始可以构造他的系统、使用特定的连接建立机制来运行它和测试它;然后,如果先前的连接机制被证明不适合他所构造的系统,他可以决定说他希望将底层连接机制改变为多线程的(或许使用线程池策略)。因为此模式提供了严格的去耦合,只需要极少的努力就可以实现这样的变动。 在你能够清楚地理解这一章中的许多例子,特别是更为高级的部分之前,你必须通读有关反应堆和IPC_SAP的章节(特别是接受器和连接器部分)。此外,你还可能需要参考线程和线程管理部分。 7.1接受器模式 接受器通常被用在你本来会使用BSDa
3、ccept()系统调用的地方。接受器模式也适用于同样的环境,但就如我们将看到的,它提供了更多的功能。在ACE中,接收器模式借助名为ACE_Acceptor的“工厂”(Factory)实现。工厂(通常)是用于对助手对象的实例化过程进行抽象的类。在面向对象设计中,复杂的类常常会将特定功能委托给助手类。复杂的类对助手的创建和委托必须很灵活。这种灵活性是在工厂的帮助下获得的。工厂允许一个对象通过改变它所委托的对象来改变它的底层策略,而工厂提供给应用的接口却是一样的,这样,可能根本就无需对客户代码进行改动(有关工厂的更多信息,请阅读“设计模式”中的参考文献)。 图7-1工厂模式示意图 ACE
4、_Acceptor工厂允许应用开发者改变“助手”对象,以用于:·被动连接建立·连接建立后的处理 同样地,ACE_Connector工厂允许应用开发者改变“助手”对象,以用于: ·主动连接建立·连接建立后的处理 下面的讨论同时适用于接受器和连接器,所以作者将只讨论接受器,而连接器同样具有相应的参数。 ACE_Acceptor被实现为模板容器,通过两个类作为实参来进行实例化。第一个参数实现特定的服务(类型为ACE_Event_Handler。因为它被用于处理I/O事件,所以必须来自事件处理类层次),应用在建立连接后执行该服务;第二个参数是“具体的”接受器(可以是在IPC_SAP一
5、章中讨论的各种变种)。 特别要注意的是ACE_Acceptor工厂和底层所用的具体接受器是非常不同的。具体接受器可完全独立于ACE_Acceptor工厂使用,而无需涉及我们在这里讨论的接受器模式(独立使用接受器已在IPC_SAP一章中讨论和演示)。ACE_Acceptor工厂内在于接受器模式,并且不能在没有底层具体接受器的情况下使用。ACE_Acceptor使用底层的具体接受器来建立连接。如我们已看到的,有若干ACE的类可被用作ACE_Acceptor工厂模板的第二个参数(也就是,具体接受器类)。但是服务处理类必须由应用开发者来实现,而且其类型必须是ACE_Event_Handler
6、。ACE_Acceptor工厂可以这样来实例化: typedefACE_AcceptorMyAcceptor; 这里,名为My_Service_Handler的事件处理器和具体接受器ACE_SOCK_ACCEPTOR被传给MyAcceptor。ACE_SOCK_ACCEPTOR是基于BSDsocket流家族的TCP接受器(各种可传给接受器工厂的不同类型的接受器,见表7-1和IPC一章)。请再次注意,在使用接受器模式时,我们总是处理两个接受器:名为ACE_Acceptor的工厂接受器,和ACE中的某种具体接受器,
7、比如ACE_SOCK_ACCEPTOR(你可以创建自定义的具体接受器来取代ACE_SOCK_ACCEPTOR,但你将很可能无需改变ACE_Acceptor工厂类中的任何东西)。重要提示:ACE_SOCK_ACCEPTOR实际上是一个宏,其定义为: #defineACE_SOCK_ACCEPTORACE_SOCK_Acceptor,ACE_INET_Addr 我们认为这个宏的使用是必要的,因为在类中的typedefs在某些平台上无法工作。如果不是
此文档下载收益归作者所有