朱堯
摘要:本文主要通過討論傳統(tǒng)的編程方法在軟件的網(wǎng)絡(luò)通信模塊開發(fā)中的問題,提出利用ACE面向?qū)ο蟮脑O(shè)計模式和框架可以幫助開發(fā)者消除通信組件的復(fù)雜性。概述了ACE的反應(yīng)器,事件處理器,接受器,連接器等框架,以及ACE在開發(fā)軟件的數(shù)據(jù)傳輸和通信模塊中的優(yōu)越性,給出了一個簡單的例子程序。
關(guān)鍵詞:ACE;數(shù)據(jù)傳輸;反應(yīng)器;事件多路分離
中圖分類號:TP336文獻(xiàn)標(biāo)識碼:A文章編號:1007-9599 (2013) 05-0000-02
1引言
隨著互聯(lián)網(wǎng)及分布式思想的普及,開發(fā)高效的網(wǎng)絡(luò)通訊組件變得越來越重要,傳統(tǒng)的API函數(shù)雖然能滿足基本的需求,但也有很多問題。網(wǎng)絡(luò)通信面臨著硬件平臺,軟件環(huán)境,網(wǎng)絡(luò)協(xié)議等的多樣性和異種性,使得開發(fā)過程的重復(fù)性高,也缺乏安全性、可移植性、和可擴(kuò)充性,直接利用底層的API函數(shù)編寫的網(wǎng)絡(luò)數(shù)據(jù)傳輸程序在實際運行過程中極容易出錯,并且代碼難以維護(hù),其傳輸?shù)目煽啃院头€(wěn)定性也難以保障,ACE的出現(xiàn)能夠很好的解決上述問題。
2ACE概述
ACE自適配通信環(huán)境(Adaptive Communication Environment)是一種面向?qū)ο螅∣O)的工具包,它實現(xiàn)了通信軟件的許多基本的設(shè)計模式。ACE的目標(biāo)用戶是在UNIX和Win32平臺上開發(fā)高性能通信服務(wù)和應(yīng)用的開發(fā)者。ACE簡化了使用進(jìn)程間通信、事件多路分離、顯式動態(tài)鏈接和并發(fā)的OO網(wǎng)絡(luò)應(yīng)用和服務(wù)的開發(fā)[1]。通過在運行時將服務(wù)與應(yīng)用動態(tài)鏈接進(jìn)應(yīng)用,并在一個或多個進(jìn)程或線程中執(zhí)行這些服務(wù),ACE使系統(tǒng)的配置和重配置得以自動化。
ACE被設(shè)計成為層次結(jié)構(gòu),在ACE框架中有三個基本層次[2]:
2.1操作系統(tǒng)適配層(ACE OS Adaptation)
它封裝了原始的、基于C的OS API,隱藏了“和平臺相關(guān)”的細(xì)節(jié),展示了統(tǒng)一的OS機(jī)制接口,供更高級的ACE使用。它使ACE的較高層與平臺依賴性屏蔽開來,從而使得通過ACE編寫的代碼保持了相對的平臺無關(guān)性,方便ACE在不同操作系統(tǒng)平臺的移植。
2.2C++包裝層(ACE C++ Wrapper Facade)
ACE C++ Wrapper Facade位于ACE OS Adaptation之上,用于構(gòu)建高度可移植的和類型安全的C++應(yīng)用[3]。這是ACE工具包最大的一部分,它將底層的C函數(shù)包裝成C++類,使之能夠用于:并發(fā)和同步,IPC,內(nèi)存管理,定時器類,容器類,信號處理,文件系統(tǒng)組件,線程管理,與此同時,降低了由于“安全性”和“可用性”的提高而帶來的性能開銷。
2.3框架和模式層(ACE Framework)
ACE Framework層屬于高層,它集成并增強(qiáng)了較低層次的C++包裝層,包括前攝器,反應(yīng)器,任務(wù)連接器,接受器,事件處理器,服務(wù)配置器,消息隊列等框架。消除了通信編程的復(fù)雜性,大大縮短應(yīng)用程序的開發(fā)周期[4]。
3ACE的幾大框架
ACE框架集成、擴(kuò)充了C++ Wrapper Facade類,加強(qiáng)了“和應(yīng)用相關(guān)的類”和“獨立于應(yīng)用的類”之間的集成與合作[3]。
3.1ACE_Reactor框架
軟件的通信模塊一般有很多不同的事件,例如定時器,I/O,信號,同步/異步等。ACE框架對事件的處理進(jìn)行了統(tǒng)一,簡化了事件驅(qū)動程序的開發(fā)。用它來檢測來自各種事件源的事件的發(fā)生,并將事件多路分離給其預(yù)先登記的事件處理器,管理處理器所定義的掛鉤方法,從而以一種應(yīng)用定義的方式處理這些事件。同時,框架提供了穩(wěn)定的接口,方便了擴(kuò)展。
當(dāng)要分派處理網(wǎng)絡(luò)通信中的不同事件時,首先要注冊相應(yīng)的事件處理程序,所有的事件處理器必須由ACE_Event_Handler這個抽象接口實現(xiàn)。它包含了很多的handle_*方法,例如handle_input(輸入事件),handle_output(輸出事件),handle_signal(OS發(fā)出的信號),handle_timeout(定時器到期),handle_exception(異常事件)等。當(dāng)ACE_Reactor管理的事件處理器上有登記過的事件發(fā)生時,反應(yīng)器將自動的回調(diào)相應(yīng)的方法。
3.2ACE Acceptor-Connector框架
接受器/連接器模式設(shè)計用于降低連接建立與連接建立后所執(zhí)行的服務(wù)之間的耦合。它們利用工廠模式(Factory Pattern)將具體的網(wǎng)絡(luò)連接操作委托給底層封裝的函數(shù)進(jìn)行處理,但是增強(qiáng)了安全性,和平臺無關(guān)性,更重要的是增加了靈活性,使得開發(fā)過程更加方便和簡單,回避了復(fù)雜繁瑣極易出錯的API函數(shù)。在這個框架中,接受器模式通過“ACE_Acceptor”這個助手工廠類實現(xiàn),ACE_Acceptor工廠用于被動連接建立連接和建立后的處理。同樣的,連接器模式通過“ACE_Connector”助手類實現(xiàn),ACE_Connector工廠用于主動連接建立和連接建立后的處理。
3.3ACE_Task框架
ACE_Task是一個含有一或多個線程,以及一個底層消息隊列的主動對象,利用這個抽象類來實現(xiàn)感興趣的任務(wù)。我們?nèi)绻麆?chuàng)建自己的任務(wù),就需要從ACE_Task類派生子類,然后分別實現(xiàn)open和close方法,在open方法中可以包含線程的初始化,內(nèi)存分配,進(jìn)程鎖等必須的資源,用以實現(xiàn)任務(wù)的初始化。相應(yīng)的,close方法是對應(yīng)的終止方法,可以包含任務(wù)資源的回收代碼等。然后在open方法中調(diào)用activate方法來啟用svc方法,svc方法是任務(wù)中新的線程的啟動點,服務(wù)特有的處理會在這個函數(shù)當(dāng)中實現(xiàn)。
4數(shù)據(jù)傳輸實例
在一些軟件模塊中,數(shù)據(jù)的傳輸顯得必不可少,尤其是行業(yè)里的重要數(shù)據(jù)文件(如txt形式的數(shù)據(jù)文件),經(jīng)常需要將采集到的數(shù)據(jù)文件通過網(wǎng)絡(luò)上傳到指定的軟件模塊進(jìn)行處理。以下將利用上述ACE的框架來構(gòu)建一個在本機(jī)的客戶端/服務(wù)器模式的數(shù)據(jù)傳輸模塊。
4.1客戶端(Client)模塊
(1)初始化客戶端的事件處理器,完成讀取并發(fā)送文件的任務(wù)。從ACE_Svc_Handler派生自己的MyClientHandler,實現(xiàn)其中的open和handle_output方法。handle_output方法是在I/O設(shè)備輸出緩沖區(qū)上有可用空間、并且新數(shù)據(jù)可以發(fā)送給它時被回調(diào),在這個函數(shù)中讀取數(shù)據(jù)文件,并發(fā)送。在open方法中得到全局的反應(yīng)器單體(ACE_Reactor::instance()),并注冊寫事件(register_handler)。
(2)建立同服務(wù)器端的連接。通過ACE_Connector的connect方法,將事件處理器(MyClientHandler)的指針和遠(yuǎn)程服務(wù)器的地址(ACE_INET_Addr類型)傳遞給它,發(fā)起同服務(wù)器端的連接。最后進(jìn)入反應(yīng)器的事件循環(huán)(run_event_loop)。
4.2服務(wù)器端(Server)模塊
(1)從ACE_Svc_Handler派生自己的服務(wù)處理器MyServiceHandler并初始化,實現(xiàn)其中的open和handle_input方法。handle_input方法是在OS內(nèi)部的偵聽隊列上收到了客戶的新連接請求時被回調(diào),用來接收從客戶端發(fā)來的數(shù)據(jù),接收完成后停止反應(yīng)器的事件循環(huán)(end_reactor_event_loop)。當(dāng)連接建立時就會自動調(diào)用open方法。同樣的,在open方法中注冊讀事件,并保持登記狀態(tài),只要有數(shù)據(jù)來就自動調(diào)用handle_input。
計算機(jī)光盤軟件與應(yīng)用2013年5期