ACE教程001-1:使用ACE Toolkit的初学者指南

 


本教程的目的是向您展示如何创建一个能够处理多个客户端连接的非常简单的服务器。 与“传统”服务器应用程序不同,此应用程序在一个进程中处理所有请求。 多处理和多线程的问题将在后面的教程中处理。


你需要什么来创建服务器?

  1. 接受客户连接的程序
  2. 处理既定连接的程序
  3. 一个主循环,处理所有事情

ACE Acceptor为我们的第一个要求提供了解决方案。 该类被赋予TCP / IP端口号,将在该端口号上侦听传入的连接。 尝试连接时,Acceptor创建一个新对象(处理程序)来处理客户端的连接,同时Acceptor返回,以侦听其他连接。

ACE EventHandler解决了我们的第二个要求。 现在这似乎并不明显,但随着我们在本教程中的进展,它将变得更加清晰。

最后,一个简单的main()函数将提供我们的程序循环。 在任何的程序初始化之后,它将进入一个无限循环,等待对Acceptor的连接尝试或EventHandler上的数据“事件”。


在继续之前,我需要引入一个ACE概念:Reactor。

我现在不想详细介绍Reactor是什么,它做了什么以及如何做到这一点但是你有必要了解一个反应器(Reactor)的基本功能,因为它将是你看到的第一段代码。 下图描绘了Reactor,Acceptor和应用程序处理程序之间的相互关系。

 

简述: 

反应器是一个对象,当其他对象上发生某些事件时它会作出反应。 这些事情被称为事件 (event)。 其他对象是您在reactor中注册的通信对象。 在注册时,您还可以指定您感兴趣的事件。当注册对象中发生感兴趣的事件时,操作系统会通知reactor。 然后,反应器使用已注册对象的成员函数来处理事件。 请注意,反应器并不关心因事件为什么发生。 对象有责任正确处理事件。 反应器只是通知事件的对象。

为什么要用反应器?

随着教程的进展,这将变得清晰。 但是,现在,一个简单的答案是:它允许单线程服务器有效地同时处理多个客户端连接。

传统上,服务器为每个服务的客户端创建一个单独的线程或进程。 对于大容量服务(例如telnet和ftp),这是合适的。 但是,对于小批量服务,流程创建的开销远远超过正在进行的实际工作。 所以......人们开始使用线程而不是进程来处理客户端。 这也很好,但在某些情况下,开销仍然太大而无法承受。 相反,为什么不让一个线程处理多个客户端并使用比one-thread-or-process-per-client更智能的负载平衡方法? 警告:处理一个进程的一个线程中的所有请求,实际上只有在几乎可以即时处理请求时才有效。

这就是反应器的动力和灵活性发挥作用的地方。 开发人员可以创建一个简单的单线程应用程序,稍后将其修改为thread-per-client, process-per-client or thread-pool 解决方案。

如果所有这些都是胡言乱语并让你认为ACE是难以学习的方式,请不要担心。 我们将详细介绍所有细节并随时解释。 我只是进入了所有这一切,以便它可以在你的脑海中开始,直到你以后需要它为止。

你可能感兴趣的:(ACE教程001-1:使用ACE Toolkit的初学者指南)