ACE自适配通讯环境(ADAPTIVECommunicationEnvironment)是可自由使用、开放源码的面向对象(OO)框架(framework),它实现了许多用于并发通讯软件的核心模式。ACE提供了一组丰富的可重用C++包装外形(wrapperfacade)和框架组件,可跨多种平台完成通用的通讯软件任务,其中包括:风波多路分离和风波处理器分派、信号处理、服务初始化、进程间通讯、共享显存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
网路部份的编程常常是搞得人一个头两个大,各类千奇百怪的问题像土行孙一样从没有提防的地方不断地冒下来,假如偶然还要还要移植到多平台下――那还不得熬到对影成两人?
大神其实不用愁了:多瞧瞧资料了解一下哪些VxWorks、Solaris下的API函数几下就搞定了。对于俺们这些手没有这么高的通常人,对还远远没有达到草木竹石均可为剑境界的凡人来说,莫非非要熬上N个熬夜再加上N的N次方的调试?
非也!
牛顿告诉我们:若能站在巨人的肩上,岂不是能做得更好?我国古人则说:工欲善其事,必先利其器。
假如才能觅得传说中的巨人,寻到那传说中的神器,一切还不迎刃而解?
就在这个伟大的时刻,ACE横空出世!
ACE的全名是ADAPTIVECommunicationEnvironment,是一组可以自由使用的(免费?)、开放源码的面向对象(OO)的架构。使用它可以践踏各个平台间的差别,大大地简化网路编程,降低出错的机会linux格式化硬盘,并且更可以――打住!且先把这茬儿说清楚。
ACE对各个操作系统的插口函数API进行封装,而且用统一的插口方式提供给程序员。换句话说,你只须要简单地调用ACE提供的函数方式(这种方式和常见的系统API极其相似),ACE都会手动地把它转换成你所在的平台上的函数:VxWorks的linux环境进程间通信,或则Solarislinux环境进程间通信,其实更不用说大名鼎鼎的WINDOWS和Linux了。实现方法么,用脚脚趾都能想下来:使用了特别多的条件编译,把不同系统上的功能相像的API函数统一上去,假如没有则模拟实现,假如有则简单地inline就可以了,还可以不折损效率。此其二也!
想不到还有其一吧?ACE将面向对象的思想运用到这种函数上面,对网路编程等部份的功能进行整修,构建起面向对象的模型。例如,ACE将联接的一方处理成为一个对象,将一个联接处理成为一个对象,原本的操作则被封装成为对象的功能。切不可轻视这一点。要晓得,这样就可以运用面向对象的思想来建立应用,但是OO的类型保护机制可以把一大批错误从运行时提早到编译阶段。其实,假如有谁非常有个性,非常喜欢用那个C语言的函数形式的,ACE也提供有那样的方式的函数来满足这些不通常的食欲。
光说不练是没有用的,且让我用一个小反例来镇一镇这些不服的双眼。(限于篇幅国内linux主机,我只在这儿列举最核心的代码:
intmain(int,char*[])
ACE_INET_Addrport_to_listen(9999);
ACE_SOCK_Acceptoracceptor;
acceptor.open(port_to_listen,1);
while(1)
ACE_SOCK_Streampeer;
ACE_INET_Addrpeer_addr;
ACE_Time_Valuetimeout(10,0);
if(0==acceptor.accept(peer,&peer_addr,&timeout,0))
charbuffer[4096];
ssize_tbytes_received;
while((bytes_received=peer.recv(buffer,sizeof(buffer)))!=-1)
peer.send_n(buffer,bytes_received);
peer.close();
return0;
寥寥数行代码,就早已实现了一个完整的服务器:它在9999端口上开始侦听,接受一个TCP联接,把它发过来的数据退还回来。假如业务完成,则断掉联接,接受下个联接,开始下一个循环。只要给这段代码包含进须要的头文件,加上几句错误处理,放在ACE的编译环境下――无论是WINDOWS,Linux的,还是UNIX的――都可以编译运行。
假如ACE的功能仅限于此,可能还不足以支持它取得这么大的成就:ACE在西方的应用已然蜚声联通、航空、保险、军事、天文、游戏等诸多的领域。事实上,前面所说的功能仅仅抢占了ACE代码的10%左右。剩下的部份,ACE实现了更为了不起的功能。
ACE融合通信领域的各个优秀的模式,借助它早已构建上去的可移植到多平台的OS层函数(就是前面所说的那一部份),构建起一个个别致的框架。这种模式都是作者等诸多的工程师在实践中积累上去的优秀经验。实际上,利益于开源的思想,现今全世界有一千七百多位工作者和数千人的核心团队进行ACE的进一步开发。可以如此说,使用ACE,你不是站在一位巨人的右臂上,而是站在全世界一千七百多人的手臂上。由此你只需对现有框架进行扩充,大大减短开发的过程,而且极大地增强程序对硬件的使用效率――而这是早已被证明的。
ACE主要提供以下几种框架供网路程序的开发:
l风波多路分离组件:ACEReactor(反应堆)和Proactor(前摄器)是可扩充的面向对象多路分离器,它们分派应用特有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的风波。
l服务初始化组件:ACEAcceptor(接受器)和Connector(联接器)组件分别使主动和被动的初始化任务与初始化一旦完成后通讯服务所执行的应用特有的任务去耦合。
l进程和线程管理:提供多进程和多线程的派生和管理方式,清除了平台的差别性。
l服务配置组件:ACEServiceConfigurator(服务配置器)支持应用的配置,这种应用的服务可在安装时和/或运行时动态装配。
l分层的流组件:ACEStream组件简化了像用户级合同栈这样的由分层服务组成的通讯软件应用的开发。
l命名服务:ACENamingService提供了单进程命名上下文、同一节点共享命名上下文和在网路上命名上下文的服务设施。
除此以外,ACE还提供了讯号、线程安全与同步、内存管理等等多种丰富的功能。ACE已然成长成为一个构建的系统,在网路编程方面,还能提供特别丰富的服务。
ACE会为此而满足吗?其实不,那样它只能逐步被淘汰。当前ACE正在建立它的中级分布式估算中间件组件,但是制订了多个项目计划进一步扩展和发展ACE的功能。所以,使用ACE不用害怕所学的知识会因时间而贬值,而事实上恰好与此相反。
利剑在手,其实要学会如何运用能够发挥它的最大功用了。ACE的创建者为我们写好了三本教材,一套两卷的《C++网路编程》和一本《ACE程序员手册》,都有中译本发行。据悉,网上有大量的资料可供查询。假如对ACE的设计感兴趣,那再简单不过了:你可以阅读它的全部的源代码:ACE是完全开源的!