ACE自適配通信環(huán)境(ADAPTIVE Communication Environment)是可自由使用、開放源碼的面向?qū)ο螅∣O)框架(framework),它實(shí)現(xiàn)了許多用于并發(fā)通信軟件的核心模式。ACE提供了一組豐富的可重用C++包裝外觀(wrapper facade)和框架組件,可跨多種平臺(tái)完成通用的通信軟件任務(wù),其中包括:事件多路分離和事件處理器分派、信號(hào)處理、服務(wù)初始化、進(jìn)程間通信、共享內(nèi)存管理、消息路由、分布式服務(wù)動(dòng)態(tài)(重)配置、并發(fā)執(zhí)行和同步,等等。
網(wǎng)絡(luò)部分的編程往往是搞得人一個(gè)頭兩個(gè)大,各種千奇百怪的問題像土行孫一樣從沒有防備的地方不斷地冒出來,如果碰巧還要還要移植到多平臺(tái)下――那還不得熬到對(duì)影成三人?
高手當(dāng)然不用愁了:多看看資料了解一下什么VxWorks、Solaris下的API函數(shù)幾下就搞定了。對(duì)于咱們這種手沒有那么高的一般人,對(duì)還遠(yuǎn)遠(yuǎn)沒有達(dá)到草木竹石均可為劍境界的凡人來說,難道非要熬上N個(gè)通宵再加上N的N次方的調(diào)試?
非也!
牛頓告訴我們:若能站在巨人的肩上,豈不是能做得更好?我國古人則說:工欲善其事,必先利其器。
如果能夠覓得傳說中的巨人,尋到那傳說中的利器,一切還不迎刃而解?
就在這個(gè)偉大的時(shí)刻,ACE橫空出世!
ACE的全名是ADAPTIVE Communication Environment,是一組可以自由使用的(免費(fèi)?)、開放源碼的面向?qū)ο螅∣O)的構(gòu)架。使用它可以藐視各個(gè)平臺(tái)間的差異,大大地簡化網(wǎng)絡(luò)編程,減少出錯(cuò)的機(jī)會(huì),而且更可以――打!且先把這茬兒說清楚。
ACE對(duì)各個(gè)操作系統(tǒng)的接口函數(shù)API進(jìn)行封裝,并且用統(tǒng)一的接口形式提供給程序員。換句話說,你只需要簡單地調(diào)用ACE提供的函數(shù)形式(這些形式和常見的系統(tǒng)API非常相像),ACE就會(huì)自動(dòng)地把它轉(zhuǎn)換成你所在的平臺(tái)上的函數(shù):VxWorks的,或者Solaris,當(dāng)然更不用說大名鼎鼎的WINDOWS和Linux了。實(shí)現(xiàn)方式么,用腳指頭都能想出來:使用了非常多的條件編譯,把不同系統(tǒng)上的功能相似的API函數(shù)統(tǒng)一起來,如果沒有則模擬實(shí)現(xiàn),如果有則簡單地inline就可以了,還可以不折損效率。此其一也!
想不到還有其二吧?ACE將面向?qū)ο蟮乃枷脒\(yùn)用到這些函數(shù)里面,對(duì)網(wǎng)絡(luò)編程等部分的功能進(jìn)行改造,建立起面向?qū)ο蟮哪P。比如,ACE將連接的一方處理成為一個(gè)對(duì)象,將一個(gè)連接處理成為一個(gè)對(duì)象,先前的操作則被封裝成為對(duì)象的功能。切不可小覷這一點(diǎn)。要知道,這樣就可以運(yùn)用面向?qū)ο蟮乃枷雭順?gòu)建應(yīng)用,而且OO的類型保護(hù)機(jī)制可以把一大批錯(cuò)誤從運(yùn)行時(shí)提前到編譯階段。當(dāng)然,如果有誰特別有個(gè)性,特別喜歡用那種C語言的函數(shù)方式的,ACE也提供有那樣的形式的函數(shù)來滿足這種不一般的胃口。
光說不練是沒有用的,且讓我用一個(gè)小例子來鎮(zhèn)一鎮(zhèn)那些不服的眼睛。(限于篇幅,我只在這里列出最核心的代碼:
int main(int, char *[])
{
ACE_INET_Addr port_to_listen (9999);
ACE_SOCK_Acceptor acceptor;
acceptor.open (port_to_listen, 1);
while (1)
{
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
ACE_Time_Value timeout (10, 0);
if( 0 == acceptor.accept (peer, &peer_addr, &timeout, 0))
{
char buffer[4096];
ssize_t bytes_received;
while ((bytes_received = peer.recv (buffer, sizeof(buffer))) != -1)
{
peer.send_n (buffer, bytes_received);
}
peer.close ();
}
}
return 0;
}
寥寥數(shù)行代碼,就已經(jīng)實(shí)現(xiàn)了一個(gè)完整的服務(wù)器:它在9999端口上開始偵聽,接受一個(gè)TCP連接,把它發(fā)過來的數(shù)據(jù)返還回去。如果業(yè)務(wù)完成,則斷開連接,接受下個(gè)連接,開始下一個(gè)循環(huán)。只要給這段代碼包含進(jìn)需要的頭文件,加上幾句錯(cuò)誤處理,放到ACE的編譯環(huán)境下――無論是WINDOWS, Linux的,還是UNIX的――都可以編譯運(yùn)行。
如果ACE的功能僅限于此,可能還不足以支持它取得如此大的成就:ACE在西方的應(yīng)用已經(jīng)遍及電信、航空、保險(xiǎn)、軍事、天文、游戲等眾多的領(lǐng)域。事實(shí)上,上面所說的功能僅僅占據(jù)了ACE代碼的10%左右。剩下的部分,ACE實(shí)現(xiàn)了更為了不起的功能。
ACE融合通訊領(lǐng)域的各個(gè)優(yōu)秀的模式,利用它已經(jīng)建立起來的可移植到多平臺(tái)的OS層函數(shù)(就是上面所說的那一部分),建立起一個(gè)個(gè)精巧的框架。這些模式都是作者等眾多的工程師在實(shí)踐中積累起來的優(yōu)秀經(jīng)驗(yàn)。實(shí)際上,利益于開源的思想,現(xiàn)在全世界有一千七百多位工作者和數(shù)百人的核心團(tuán)隊(duì)進(jìn)行ACE的進(jìn)一步開發(fā)?梢赃@么說,使用ACE,你不是站在一位巨人的肩膀上,而是站在全世界一千七百多人的肩膀上。由此你只需對(duì)現(xiàn)有框架進(jìn)行擴(kuò)展,大大縮短開發(fā)的過程,并且極大地提高程序?qū)τ布氖褂眯狮D―而這是已經(jīng)被證明的。
ACE主要提供以下幾種框架供網(wǎng)絡(luò)程序的開發(fā):
l 事件多路分離組件:ACE Reactor(反應(yīng)堆)和Proactor(前攝器)是可擴(kuò)展的面向?qū)ο蠖嗦贩蛛x器,它們分派應(yīng)用特有的處理器,以響應(yīng)多種類型的基于I/O、定時(shí)器、信號(hào)和同步的事件。
l 服務(wù)初始化組件:ACE Acceptor(接受器)和Connector(連接器)組件分別使主動(dòng)和被動(dòng)的初始化任務(wù)與初始化一旦完成后通信服務(wù)所執(zhí)行的應(yīng)用特有的任務(wù)去耦合。
l 進(jìn)程和線程管理:提供多進(jìn)程和多線程的派生和管理方法,消除了平臺(tái)的差異性。
l 服務(wù)配置組件:ACE Service Configurator(服務(wù)配置器)支持應(yīng)用的配置,這些應(yīng)用的服務(wù)可在安裝時(shí)和/或運(yùn)行時(shí)動(dòng)態(tài)裝配。
l 分層的流組件:ACE Stream組件簡化了像用戶級(jí)協(xié)議棧這樣的由分層服務(wù)組成的通信軟件應(yīng)用的開發(fā)。
l 命名服務(wù):ACE NamingService提供了單進(jìn)程命名上下文、同一節(jié)點(diǎn)共享命名上下文和在網(wǎng)絡(luò)上命名上下文的服務(wù)設(shè)施。
除此以外,ACE還提供了信號(hào)、線程安全與同步、內(nèi)存管理等等多種豐富的功能。ACE已經(jīng)成長成為一個(gè)完善的系統(tǒng),在網(wǎng)絡(luò)編程方面,能夠提供非常豐富的服務(wù)。
ACE會(huì)因此而滿足嗎?當(dāng)然不,那樣它只能逐漸被淘汰。當(dāng)前ACE正在完善它的高級(jí)分布式計(jì)算中間件組件,并且制定了多個(gè)項(xiàng)目計(jì)劃進(jìn)一步擴(kuò)充和發(fā)展ACE的功能。所以,使用ACE不用擔(dān)心所學(xué)的知識(shí)會(huì)因時(shí)間而貶值,而事實(shí)上正好與此相反。
利劍在手,當(dāng)然要學(xué)會(huì)怎么運(yùn)用才能發(fā)揮它的最大功用了。ACE的創(chuàng)建者為我們寫好了三本教材,一套兩卷的《C++網(wǎng)絡(luò)編程》和一本《ACE程序員指南》,都有中譯本發(fā)行。此外,網(wǎng)上有大量的資料可供查詢。如果對(duì)ACE的設(shè)計(jì)感興趣,那再簡單不過了:你可以閱讀它的全部的源代碼:ACE是完全開源的!