初始化和結束伺服器端ice run time的實現可分為三種方式:常用main函式實現,利用
類實現,利用ice::service類等。
ice run time 的主要進入點是由本地介面ice::communicator表示,在程式的開始必須首先呼叫ice::initialize對ice run time 進行初始化;ice::communicator返回乙個智慧型指標,指向乙個 ice::communicator例項。
初始化的**在服務端main函式實現大致如:ice::
communicatorptr
ic = ice::initialize(argc , argv);。如果在初始化過程中出了任何問題,ice::initialize 會丟擲異常。
在離開main函式之前,必須呼叫communicator::destroy來結束ice run time 。 destroy會等待任何正在執行的操作呼叫完成;如果在呼叫destroy函式之前就終止main函式,會導致不確定的後果。
#include int main(int argc, char * argv)
catch (const ice::exception & e) catch (const std::string & msg) catch (const char * msg)
if (ic)
return status;
}
namespace ice
;}
其程式**的實現大致如下:
public:
virtual int run(int, char * )
}; int main(int argc, char * argv)
這裡不再詳細介紹ice::service。詳細資料可以參考 《ice-1.3.0_cn.pdf》第10章中的內容。
在客戶端,介面對映到**類(參見5.12 節)。在伺服器端,介面對映到骨架類。對於相應的介面上的每個操作,骨架類都有乙個對應的純虛方法。
例如,有乙個node介面的定義:
module filesystem
; // ...
};
slice 編譯器為這個介面生成這樣的定義:
namespace filesystem
; // ...
}
下面是骨架類的幾點特性:
• 和客戶端一樣,slice 模組對映到名字相同的c++ 名字空間,所以骨架類定義會放在名字空間filesystem 中。
• 骨架類的名字與slice 介面的名字(node)相同。
• 對於slice 介面中的每個操作,骨架類都有乙個對應的純虛成員函式。
• 骨架類是抽象基類,因為它的成員函式是純虛函式。
• 骨架類繼承自ice::object (這個類形成了ice 物件層次的根)。
要給ice 物件提供實現,我們必須建立servant 類,繼承對應的骨架類。例
如,要為node 介面建立servant,可以編寫:
#include // slice-generated header
class nodei : public virtual filesystem::node
;
首先在堆上建立乙個顯得nodei例項,把它的位址賦值給型別為
nodeiptr
的智慧型指標:
typedef iceutil::handlenodeiptr;
nodeiptr servant = new nodei("fred");
使用智慧型指標的好處是避免偶然發生記憶體洩露。
每乙個ice物件都需要乙個標識。在使用同乙個物件介面卡的所有servant中,該標識必須是唯一的。ice 物件標識是一種結構,下面是它的slice 定義:
module ice;
// ...
};
2.3)啟用servant
只有在你顯式地把servant 告知物件介面卡之後, ice run time 才會知道這個servant 的存在。要啟用servant,就要呼叫物件介面卡的add 操作:
void activateservant(const string & name) // refcount == 1
呼叫物件介面卡的add 操作,會把servant 指標和servant 的標識增加到介面卡的servant 對映表中,並把「ice 物件的**」與「伺服器記憶體中的正確的servant 例項」鏈結在一起。
同時ice也提供了addwithuuid()函式,只要一步,就可以生成乙個uuid、並把servant 增加到servant 對映表中。這樣就避免了額外建立標識的操作。重寫上面的函式
void activateservant(const string & name)
一旦我們啟用了ice 物件的servant,伺服器就可以處理針對這個物件的客戶請求了。但是,只有擁有了物件的**,客戶才能訪問該物件。
而象介面卡含有建立**所需的全部詳細資料:定址資訊和協議資訊,還有物件標識。物件介面卡的add 和addwithuuid servant 啟用操作會返回對應的ice 對
象的乙個**。這意味著,我們可以編寫:
typedef iceutil::handlenodeiptr;
nodeiptr servant = new nodei(name);
nodeprx proxy = nodeprx::uncheckedcast(_adapter->addwithuuid(servant));
// pass proxy to client...
在此我們需要使用uncheckedcast,因為addwithuuid 返回的**的型別是ice::
objectprx
。 伺服器端的引數傳遞所遵循的規則和客戶端一樣:
• in 引數通過值或const 引用傳遞。
• out 引數通過引用傳遞。
• 返回值通過值傳遞。
例子說明:
inte***ce example
;
為這個介面生成的骨架類:
class example : virtual public ::ice::object
;
要從操作實現中丟擲異常,你只需例項化異常,初始化,然後丟擲它。例如:
void filesystem::filei::write(const filesystem::lines & text,const ice::current &)
};
HTTP服務端JSON服務端
最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...
APP的服務端
本文主要內容包括 1.緊密耦合 無線介面和web應用緊耦合,web端的修改會影響無線介面,web端的發布導致無線介面被動連帶發布,web端的bug影響無線介面的可用性,反過來也一樣,無線介面的任何變化會影響web應用。2.重複開發 3.穩定性 圖二 系統拆分示意 1.對等隔離 2.統一服務 adap...
服務端系統
1.高可用 容錯和降級。容錯級別上,忽略次要 error 服務降級 程式中部分error是可以忽略處理的,或者打個日誌標記下,而不用結束整個執行流程。服務降級是指,當依賴的非核心模組出問題時,可以選擇不請求或者熔斷式請求 過載保護 資料可以不吐給客戶端,這就要求對資料或者服務進行級別劃分,優先保證使...