-
ACE Tutorial [翻译]01-page01
2004-10-24
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://jnn.blogbus.com/logs/459148.html
初学者如何实现ACE工具包
本教程的目的是向你展示如何创建一个简单的能够同时响应多个客户连接的服务器程序。于“传统”的服务器端应用不同,本服务程序只在一个进程中响应所有的客户请求。有个多进程或者多线程方面的问题将在本教程的后续部分讨论。
创建一个服务器需要做那些事情?
1. 需要接受客户端的请求
2. 建立连接后相关处理
3. 需要一个主程序来循环处理上面内容
ACE 中的Acceptor为我们服务器程序需求提供了一个很好的解决方案。这个类通过给定的TCP/IP端口号监听客户发来的连接请求。当acceptor接收到的连接请求后,它将创建一个新的对象(the handler)来处理客户的请求,同时acceptor返回并监听其他的连接。
ACE中的EventHandler可以满足我们的第二个需求。虽然这样看上去不太明显,但是随着教程的深入,大家将会逐渐认识到EventHandler的重要性。
最后,通过一个简单的main() 方法来实现的我们的循环处理程序。循环处理程序的作用就是在所有的初始化操作完毕之后,进入一个死循环,在该循环中负责调用Acceptor处理客户连接请求或者调用EventHandler处理数据“事件”。
在我们继续下面教程之前,需要向大家介绍一下ACE中的另一个重要概念, Reactor (反应器)
在现在的阶段我不希望大家对什么是reactor,reactor是做什么的,以及reactor是如何实现这些细节很了解,但是你需要能够理解reactor最基本的功能,因为在下面的第一段代码中,将会出现reactor。(负责注册事件处理句柄以及分发网络事件)
下图展示的 Reactor,Acceptor以及应用处理句柄之间的相互关系。

简单来说: reactor是一个负责对发生在其他对象的事情作出响应的对象。这些事情被称之为事件。其他对象是你向reactor注册的通讯对象。在向reactor注册的过程时,你可以向这些对象指定你所感兴趣的事件。当你注册的对象感兴趣的事件发生时,操作系统会将这些事件向reactor转发。Reactor通过调用注册对象的成员方法来处理这些事件。注意 reactor并不关心事件是如何发生的。它只是负责正确的处理事件。Reactor只是简单地向注册对象转发事件。
为什么使用reactor?
这将随着教程的深入,而逐渐清晰。现在,一个比较简单的回答是,它能够允许多个客户的同时连接能够在一个单线程服务器中有效地被处理。
传统地服务器一般都会每一个所服务的客户创建一个独立的线程或者进程。对于一个服务量比较大的服务(例如telnet和ftp)这样的策略是很正确的。但是对于一个轻量级的服务俩说,创建处理进程所代来的系统负担已经超出的实际工作的负担。所以大家开始使用线程来替代进程来处理客户的请求。这是个比较好的解决方案,但是在一些情况下,也会对系统带来很大的负担。相比之下,为什么不使用单线程来响应多个客户的请求,或者是使用比一个线程/进程一个客户更加智能的负载均衡方法来实现。
Caveat:在一个进程中的一个线程里面处理所有的请求只在这个请求可以立刻被处理完的情况下适用。
这就是reactor最强大的地方,同时也是最方便扩展的地方。开发者可以创建一个简单的,单线程的应用,在后面的教程里,可以进一步扩展到 线程-每-用户,进程-每-用户或者是线程池的解决方案。
如果是上面的胡言乱语使你认为ACE很难理解,不必担心。我们将通过代码细节再向你详细讲述。所以你可以把上面的内容先放在一边,当你在代码中遇到的时候在回顾一下。
随机文章:
ACE Tutorial [翻译] 08-page04 2004-11-29ACE Tutorial [翻译] 08-page03 2004-11-29ACE Tutorial [翻译] 08-page02 2004-11-29ACE Tutorial [翻译] 08-page01 2004-11-29ACE Tutorial [翻译] 06 -page05 2004-11-21
收藏到:Del.icio.us








评论