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